О, NSOperation
. Такая странная история у вас есть.
NSOperation
относительно старый (в терминах iOS, довольно современный в условиях ObjC). Он был добавлен в OS X 10.5. До OS X 10.6/iOS 4 объектов не было NSBlockOperation
. Блоков вообще не было. Таким образом, единственный способ сделать операцию - подкласс или использовать NSInvocationOperation
. Оба подхода являются громоздкими, но все же проще и эффективнее, чем более старый подход к использованию NSThread
.
(Это было правильно в то время, когда многоядерность стала чем-то вроде этого. 10.5 славилась добавлением Core Animation, которое я считал первой крупной упреждающей многозадачной структурой в Cocoa. До 10.5, большинство вещей было выполнено с помощью runloop и совместная многозадачность, которая на самом деле очень эффективна и эффективна для одноядерных систем, но она не очень хорошо масштабируется для многоядерных систем. Инструменты, такие как NSOperation
, были предоставлены, чтобы помочь нам написать лучший многоядерный код, но GCD был , поэтому гораздо более мощным, поскольку он полностью доминировал над тем, как многозадачный код написан в Cocoa.)
Когда вы подклассом NSOperation
, вам нужно сообщить системе, является ли ваша операция ази nchronous. Это не запрос для асинхронного запуска. Это обещание, что ваш метод start
не будет блокироваться. Это зависит от вашего метода start
, чтобы убедиться, что операция действительно асинхронна.
Это необходимо только в том случае, если ваш NSOperation
запускается вручную, и даже тогда он часто не нужен. Если вы положили его на номер NSOperationQueue
(и вы действительно должны это делать), это свойство не имеет значения. Я помню, что это создавало много путаницы в то время.
Это стало еще более неуместным с момента введения блоков. Почти всегда гораздо проще использовать NSBlockOperation
(или dispatch_async
), чем для подкласса NSOperation
, что всегда было довольно сложно, чтобы получить совершенно правильное решение.
На всякий случай, если вы еще не прочитали его, если вы хотите изучить параллелизм Cocoa, вы определенно хотите начать с Concurrency Programming Guide.
Действительно спасибо. Если я правильно понимаю, вы имеете в виду синхронный в отдельном потоке, действительно такой же, как асинхронный. И фактически, нет необходимости изменять асинхронное свойство при использовании 'NSOperationQueue'. – rrrain
Исправьте оба значения. –