1

I'm am performing JSON deserialization with JSONTouch, but it's taking too long and it's blocking the UI, so I've tried to make a GCD background queue to put the serialization in a background thread. Sometimes it runs fine, but sometimes I get a EXC_BAD_ACCESS on deserializeAsDictionary:weakSelf.mutableData error:&theError];.

I'm at a loss as to why. I've made mutableData an atomic property. I'm making 3 requests at once, so I guess something it has to do with threads trying to access the mutableData? or perhaps mutableData is not in a good state when the block runs?

Thanks a lot!

-(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);
}
ReenReen
  • 117
  • 1
  • 9

1 Answers1

1

The problem was that I was using one mutableData object to store the response of the three requests, and when one connection finished and the connectionDidFinishLoading: handler was reading the data, another connection in another thread was appending data to it.

I created a separate NSMutableData object for every request, and added code to connectionDidFinishLoading: so that it reads from the correct NSMutableData object.

My application is very responsive now that the handler is running in another GCD queue!

ReenReen
  • 117
  • 1
  • 9