Почему мой 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 способ убедиться, что вы завершаете всю работу до освобождения.

Другие вопросы по тегам