2010-10-21 2 views
0

Я использовал NSOperationQueue в своем iPhone-приложении раньше в iPhone OS 3.0, но теперь в iOS 4.0 код работает неправильно. Он работает правильно только один раз и во всех последующих вызовах, он не работает. Были ли изменения в NSOperationQueue в 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

Пожалуйста, объясните, что «не работает». Сбой или вообще ничего не происходит, вы получите предупреждение и сообщение об ошибке, какой-нибудь другой намек? – DarkDust

+0

Нет, никаких предупреждений, ошибок и сбоев нет. То, что я делаю, это создание nsoperationqueue и выполнение функции. И я показываю spinner, пока эта nsoperation не завершится. Это работает в первый раз, но во второй раз. Код, который должен выполняться после завершения nsoperationqueue, выполняется до завершения nsoperation. – nishantcm

+0

Как насчет предоставления нам фрагмента кода? – tia

ответ

2

Вы создаете NSOperationQueue, добавив операцию к нему, а затем отпуская очереди. Это не то, как NSOperationQueues были разработаны для работы. Предполагается, что NSOperationQueue будет сохраняться, при необходимости добавляя к нему операции.

Возможно, это не так, потому что вы освобождаете NSOperationQueue, прежде чем у вас есть шанс отключить поток для вашей операции. Возможно, на более старых версиях ОС это было просто способно сделать это из-за некоторого времени.

Я рекомендую выделить очередь обработки эффекта, когда она вам понадобится, или инициализировать объект-контроллер, а затем сохранить эту очередь в качестве переменной экземпляра объекта-контроллера. Эта очередь будет освобождена одновременно с вашим объектом контроллера, но вы, вероятно, захотите отменить все текущие операции в это время и использовать метод –waitUntilAllOperationsAreFinished NSOperationQueue, чтобы убедиться, что вы завершаете всю работу до освобождения.

Смежные вопросы