我正在用JSONTouch执行JSON反序列化,但时间太长,并且阻塞了UI,所以我尝试制作一个GCD后台队列,将序列化放在后台线程中。有时它运行得很好,但有时我会在deserializeAsDictionary:weakSelf.mutableData error:&theError];
上得到EXC_BAD_ACCESS。
我不知道为什么。我已经将mutableData作为一个原子属性。我一次发出3个请求,所以我想这与试图访问mutableData的线程有关?或者当块运行时,mutableData的状态可能不好?
非常感谢!
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
__weak myViewController *weakSelf = self;
dispatch_queue_t updateQueue = dispatch_queue_create("parse json", NULL);
dispatch_async(updateQueue, ^{
NSError *theError = nil;
// This is the call that gives me EXC_BAD_ACCESS
NSDictionary *dict = [[CJSONDeserializer deserializer]
deserializeAsDictionary:weakSelf.mutableData error:&theError];
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf setMutableData: nil];
});
});
dispatch_release(updateQueue);
}
问题是我使用一个mutableData
对象来存储三个请求的响应,当一个连接完成并且connectionDidFinishLoading:
处理程序正在读取数据时,另一个线程中的另一个连接正在向其附加数据。
我为每个请求创建了一个单独的NSMutableData对象,并向connectionDidFinishLoading:
添加了代码,以便它从正确的NSMutableData对象中读取。
我的应用程序响应非常快,因为处理程序正在另一个GCD队列中运行!