NSInvocationOperation и основной поток - PullRequest
2 голосов
/ 17 мая 2010

Представьте, что у меня есть представление с некоторым объектом UIKit в качестве его подпредставления (например, UIActivityIndicatorView - это не имеет значения). Это представление также имеет селектор, называемый doSomething, который каким-то образом управляет объектом UIKit (в нашем примере он может запускать или останавливать представление индикатора).

Я создаю NSInvocationOperation (из частей кода представления) с initWithTarget:self selector:@selector(doSomething) object:nil. Затем добавьте его к NSOperationQueue. И все отлично работает.

Как ?! Это должен быть новый поток и не потокобезопасный объект UIKit! Почему не найдено ошибок (и не произошло сбоев)?

1 Ответ

15 голосов
/ 17 мая 2010

Класс NSInvocationOperation - это конкретный подкласс NSOperation, в котором реализует непараллельную операцию .

В случае одновременной операции задача операции выполняется синхронно , то есть объект операции не создает отдельный поток, в котором выполняется задача. Таким образом, когда вызывается метод start не параллельной операции, операция выполняется немедленно в текущем потоке. К тому времени, когда метод start такого объекта возвращает управление вызывающей стороне, сама задача завершена.

Однако использование NSOperationQueue меняет это поведение. NSOperationQueue всегда выполняет операции одновременно; непараллельная операция требует отдельного потока для одновременного выполнения, и NSOperationQueue предоставляет этот поток.

Это означает, что если вы выполните NSInvocationOperation напрямую, вы сможете получить доступ к потокобезопасному объекту UIKit (операция будет выполняться в том же потоке). В вашем случае, если вы используете NSOperationQueue, вы должны запланировать работу, которая использует объект UIKit в основном потоке, используя executeSelectorOnMainThread: withObject: waitUntilDone: из вашего селектора вызова.

...