Grand Central Dispatch - передача данных между потоками - PullRequest
1 голос
/ 07 ноября 2010

Я пытаюсь запустить процесс в фоновом режиме, чтобы сгенерировать строку, которая затем используется в основном потоке (отправляется на удаленный сервер). Код отлично работает в симуляторе, и строка записывается дважды какожидается.

На устройстве (iPad, 4.2 и различных iPhone) каждый раз происходит сбой с EXC_BAD_ACCESS.Кажется, что myString выходит из области видимости, но это похоже на пример в Википедии , где используется тот же принцип.

Код выглядит так:

Кто-нибудь знает, почему это дает сбой, и лучший способ исправить это?

Я сделал ошибку, упростив свой код для ясности своего вопроса.

В основной очереди я на самом деле отправляю сообщения самому себе с другим вызовом, и это приводит к неправильному доступу.вызвать метод в моей асинхронной очереди, а внутри метода обернуть код в dispatch_async (dispatch_get_main_queue (), ^ {});блок.

Надеюсь, это поможет кому-то еще.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

Я сделал ошибку, упростив свой код для ясности моего вопроса.

В основной очереди я на самом деле отправляю сообщения о себе другим вызовом, и это вызывает плохой доступ.

Решением было вызвать метод в моей асинхронной очереди, а внутри метода обернуть код в dispatch_async (dispatch_get_main_queue (), ^ {});блок.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 07 ноября 2010

Полагаю, NSString - это объект автоматического выпуска, поэтому он выйдет из области видимости и будет выпущен до использования в блоке кода основной очереди. Попробуйте добавить сохранение / освобождение в строку NSString:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 [myString retain];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
  [myString release];
 });

});
...