NSOperation внутри NSOperationQueue не выполняется - PullRequest
5 голосов
/ 26 марта 2012

Мне действительно нужна помощь здесь. Я в отчаянии в этот момент.

У меня есть NSOperation, которое при добавлении в NSOperationQueue не запускается. Я добавил некоторые записи, чтобы увидеть статус NSOperation, и вот результат:

Queue operations count = 1
Queue isSuspended = 0
Operation isCancelled? = 0
Operation isConcurrent? = 0
Operation isFinished? = 0
Operation isExecuted? = 0
Operation isReady? = 1
Operation dependencies? = 0

Код очень прост. Ничего особенного.

       LoadingConflictEvents_iPad *loadingEvents = [[LoadingConflictEvents_iPad alloc] initWithNibName:@"LoadingConflictEvents_iPad" bundle:[NSBundle mainBundle]];

       loadingEvents.modalPresentationStyle = UIModalPresentationFormSheet;
       loadingEvents.conflictOpDelegate = self;

       [self presentModalViewController:loadingEvents animated:NO];

       [loadingEvents release];

       ConflictEventOperation *operation = [[ConflictEventOperation alloc] initWithParameters:wiLr.formNumber pWI_ID:wiLr.wi_id];

       [queue addOperation:operation];           

       NSLog(@"Queue operations count = %d",[queue operationCount]);
       NSLog(@"Queue isSuspended = %d",[queue isSuspended]);
       NSLog(@"Operation isCancelled? = %d",[operation isCancelled]);
       NSLog(@"Operation isConcurrent? = %d",[operation isConcurrent]);
       NSLog(@"Operation isFinished? = %d",[operation isFinished]);
       NSLog(@"Operation isExecuted? = %d",[operation isExecuting]);
       NSLog(@"Operation isReady? = %d",[operation isReady]);
       NSLog(@"Operation dependencies? = %d",[[operation dependencies] count]);


       [operation release];

Теперь моя операция делает много вещей с основным методом, но проблема никогда не вызывается. Главное никогда не выполняется. Самое странное (поверьте, я не сумасшедший .. пока). Если я поставлю точку останова в любой строке NSLog или при создании операции, будет вызван метод main, и все будет работать отлично.

Это работало нормально долгое время. Недавно я вносил некоторые изменения, и, видимо, что-то испортило. Одним из таких изменений было обновление устройства до iOS 5.1 SDK (iPad).

Чтобы добавить что-то, у меня есть версия этого приложения для iPhone (iOS 5.1), которая использует тот же объект NSOperation. Разница только в интерфейсе, и все работает нормально.

О, и это происходит только на реальном устройстве. В симуляторе все работает нормально.

Любая помощь будет по достоинству оценена.

С уважением,

Ответы [ 4 ]

5 голосов
/ 26 марта 2012

Если операция параллельная, вам нужно реализовать -start, а не -main.

3 голосов
/ 18 января 2013

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

Моя проблема заключалась в том, что в моем подклассе NSOperation я имел:

@property CGPoint start;

, который при синтезе создает метод:

-(CGPoint)start

который отменяет запуск NSOperation - (void); Метод, который является показателем для одновременной NSOperation, и предотвращает все обычные вещи, которые происходят в - (void) start, происходит, что, таким образом, предотвращает вызов - (void) основного метода вообще.

Как только я переименовал свою собственность во что-то, отличное от start, она работала нормально.

3 голосов
/ 29 марта 2012

Хорошо, я наконец-то решил эту проблему.

Проблема, с которой я столкнулся, была связана с тем, что NSOperation работал в фоновом режиме все время (но в другой очереди). Эта операция блокировала выполнение любого другого потока (NSOperation). Это происходило только в iPad 1, потому что это не двухъядерный.

Мой NSOperation делал что-то вроде этого с основным методом:

- (void)main 
{
    while (![self isCancelled]) {
        //Do stuff
    }
}

И NSOperation постоянно делал это все время

Глупый я, я не дал ОС время работать с другими потоками, поэтому добавление сна сделало трюк

- (void)main
{
    while (![self isCancelled]) {
        [NSThread sleepForTimeInterval:0.5];
        //Do Stuff
    }
}

Этот сон дает ОС возможность работать с другими потоками.

Почему установка точки останова делает эту работу? ... отладчик остановил все потоки, и поскольку точка останова была в моей другой операции NSO, этот поток был выполнен.

0 голосов
/ 27 марта 2012

Хорошо, эта проблема возникает только на устройствах iPad 1 с приложением, скомпилированным с SDK 5.1. Я пробовал с iPad 1 с iOS 4.2.1 и iPad 1 с iOS 5.1. Оба дают одинаковые проблемы.

Конечно, это работало на обоих iPad с приложением, скомпилированным с SDK 4.3

...