Разбор JSON с использованием Grand Central Dispatch в connectionDidFinishLoading :? - PullRequest
1 голос
/ 02 марта 2012

Я выполняю десериализацию JSON с помощью JSONTouch, но это занимает слишком много времени и блокирует пользовательский интерфейс, поэтому я попытался создать фоновую очередь GCD, чтобы поместить сериализацию в фоновый поток. Иногда он работает нормально, но иногда я получаю EXC_BAD_ACCESS на deserializeAsDictionary:weakSelf.mutableData error:&theError];.

Я в недоумении, почему. Я сделал 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 Ответ

1 голос
/ 05 марта 2012

Проблема заключалась в том, что я использовал один объект mutableData для хранения ответа на три запроса, и когда одно соединение завершилось и обработчик connectionDidFinishLoading: считывал данные, другое соединение в другом потоке добавляло данные к нему .

Я создал отдельный объект NSMutableData для каждого запроса и добавил код в connectionDidFinishLoading:, чтобы он читал из правильного объекта NSMutableData.

Мое приложение очень отзывчиво теперь, когда обработчик работает в другой очереди GCD!

...