在connectionDidFinishLoading中使用Grand Central Dispatch解析JSON:



我正在用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队列中运行!

最新更新