NSOperationQueue не работает в IOS5 - PullRequest
       12

NSOperationQueue не работает в IOS5

7 голосов
/ 17 октября 2011

У меня есть проект, который загружает изображения в фоновом режиме, используя NSOperationQueue. До сих пор это работало на устройствах с IOS 4.3. Однако, если я создаю приложение с базовой SDK 4.3 или с 5 и запускаю приложение на устройстве с IOS5, приложение вылетает. Когда приложение запускается, оно добавляет NSOperation объектов в очередь для загрузки изображений. Если между ними я нажимаю кнопку «Назад», я отменяю NSOperation, и он дает сбой, и на консоли отображается следующий след:

#0  0x004727b7 in ____NSOQSchedule_block_invoke_0 ()
#1  0x026a5618 in _dispatch_call_block_and_release ()
#2  0x026a7a10 in _dispatch_worker_thread2 ()
#3  0x974bb781 in _pthread_wqthread ()
#4  0x974bb5c6 in start_wqthread ()

и печатает «ResourceLoadOperation isFinished = YES без запуска из очереди, в которой он находится» Если я прокомментирую вызов метода cancel, приложение не завершится сбоем. Есть ли какие-нибудь обновления на NSOperation изменениях для IOS5?

1 Ответ

12 голосов
/ 16 ноября 2011

У меня была такая же проблема при сборке под iOS 5. В итоге я создал флаг с именем operationStarted, который по умолчанию был NO, и я переключился на YES при вызове метода start.Затем в моем методе finish (где я генерирую уведомления KVO) я проверил значение флага перед запуском уведомлений.

Определение флага выглядит следующим образом:

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted;

Метод start:

- (void)start {
    [self setOperationStarted:YES];
    ...
}

Мой finish метод, который вызывается, когда операция завершается или отменяется:

- (void)finish {    
    if (![self isOperationStarted]) return;

    [self willChangeValueForKey:@"isExecuting"];
    executing = NO;
    [self didChangeValueForKey:@"isExecuting"];

    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];
}

Это привело к решению проблемы для меня.Надеюсь, это поможет кому-то еще.

...