Почему мой NSOperationQueue не работает правильно в iOS 4.0?
Ранее я использовал NSOperationQueue в своем приложении для iPhone в iPhone OS 3.0, но теперь в iOS 4.0 код работает неправильно. Он работает правильно только один раз и на всех последующих вызовах, он не работает. Были ли изменения в NSOperationQueue в iOS 4.0?
Соответствующий код выглядит следующим образом:
- (void) starteffectFunction {
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(starteffectProcessing)
object:nil];
[queue addOperation:operation];
[operation release];
[queue release];
[spinner startAnimating];
}
-(void) starteffectProcessing{
some code executes. code snippet. A
......
this code is note supposed to execute before A completes. But this executes before A.
}
1 ответ
Вы создаете NSOperationQueue, добавляете к нему операцию, а затем освобождаете очередь. Это не то, как NSOperationQueues были разработаны для работы. Предполагается, что NSOperationQueue сохраняется, и вы добавляете к нему операции по мере необходимости.
Вероятно, это сбой, потому что вы освобождаете NSOperationQueue до того, как у него появится возможность запустить поток для вашей операции. Возможно, на старых версиях ОС это было возможно сделать из-за некоторой временной ошибки.
Я рекомендую выделять очередь обработки эффектов при первой необходимости или при инициализации объекта контроллера, а затем хранить эту очередь как переменную экземпляра объекта контроллера. Эта очередь будет освобождена одновременно с вашим объектом контроллера, но вы, вероятно, захотите отменить все текущие операции в это время и использовать NSOperationQueue –waitUntilAllOperationsAreFinished
способ убедиться, что вы завершаете всю работу до освобождения.