2012-03-01 1 views
1

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

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