2012-03-01 56 views
1

我正在用JSONTouch执行JSON反序列化,但是它耗时太长,它阻塞了UI,所以我试图让一个GCD背景队列将序列化放到后台线程中。有时它运行良好,但有时我会在deserializeAsDictionary:weakSelf.mutableData error:&theError];上获得EXC_BAD_ACCESS。在connectionDidFinishLoading中使用Grand Central Dispatch解析JSON:?

我不知道为什么。我已经使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); 
} 

回答

1

的问题是,我用一个mutableData对象来存储三个请求的响应,当一个连接完成,connectionDidFinishLoading:处理程序读取数据时,在另一个线程另一个连接是数据附加到它。

我为每个请求创建了一个单独的NSMutableData对象,并将代码添加到connectionDidFinishLoading:,以便它从正确的NSMutableData对象读取。

现在,我的应用程序非常灵敏,处理程序在另一个GCD队列中运行!

相关问题