NSOperation на iPhone

Я искал несколько конкретных сценариев, когда NSOperation на iPhone станет идеальным инструментом для использования в приложении. Насколько я понимаю, это оболочка для написания собственного threaded кода. Я не видел, чтобы какие-либо демонстрационные приложения Apple использовали его, и мне интересно, не упускаю ли я отличный инструмент вместо того, чтобы использовать NSThread.

Идеальным решением здесь было бы описание сценария использования NSOperation и того, как вы могли бы использовать его для решения ваших проблем.


person Coocoo4Cocoa    schedule 06.05.2009    source источник
comment
Возможно, вы захотите выбрать один из этих отличных ответов в качестве решения. (:   -  person corydoras    schedule 16.12.2009


Ответы (7)


У Cocoa Is My Girlfriend есть хорошее руководство об использовании NSOperation и NSOperationQueue. В учебнике используется NSOperation для одновременной загрузки нескольких веб-страниц в отдельных потоках.

Также см. эту статью Mac Research.

person e.James    schedule 06.05.2009
comment
Здесь есть еще одно руководство: dribin.org/dave/blog/ archives / 05.05.2009 / concurrent_operations - person wbyoung; 07.05.2009
comment
Я бы также посоветовал пройтись по материалам Standord Class. Они широко используют NSOperation для асинхронной загрузки изображений в примере с flickr. Они доступны в iTunes бесплатно. - person Jab; 07.05.2009

То, как я использую его в своих приложениях для iPhone, заключается в том, чтобы в основном создать член NSOperationQueue в моем делегате приложения и сделать его доступным через свойство. Затем каждый раз, когда мне нужно запускать что-то в фоновом режиме, например скачать XML, я просто создам NSInvocationOperation и отправлю его в очередь.

NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];
person nduplessis    schedule 07.05.2009

Одним словом: NSOperationQueue

NSOperationQueue является потокобезопасным (вы можете добавлять к нему операции из разных потоков без необходимости блокировок) и позволяет связывать объекты NSOp вместе.

Приложение My Flickr для iPhone, Reflections, широко использует NSOperation и NSOperationQueue для управления загрузкой изображений и XML.

Предостережение: убедитесь, что вы прочитали, перечитали и поняли, что означают документы, когда они говорят о «параллелизме».

person Community    schedule 07.05.2009
comment
На самом деле он не действительно потокобезопасен, с ним есть проблема в Mac OS X 10.5. См. mikeash.com/?page=pyblog/dont-use-nsoperationqueue .html. Хотя они упоминают, что iPhone кажется невосприимчивым к этому из-за одноядерного процессора. - person nduplessis; 07.05.2009
comment
В качестве обновления mikeash.com/pyblog/use-nsoperationqueue.html был продолжение ссылки в комментарии @nduplessis, в котором отмечается, что 10.5.7 исправляет упомянутые проблемы. Итак, NSOperationQueue, вероятно, теперь является потокобезопасным. - person Shane Breatnach; 15.02.2011

Вам также следует проверить этот URL: http://developer.apple.com/cocoa/managingconcurrency.html

Все приведенные выше ответы хороши, но убедитесь, что вы прочитали статью выше и свободно используете эту строку в своем коде:

if ( self.isCancelled ) return;

Эта строка не использовалась в образцах, предоставленных Coca is my Girlfriend, и только после того, как я получил журналы сбоев с места, я понял, что это проблема / концепция.

person esilver    schedule 09.06.2011
comment
Вы можете объяснить, что именно делает эта строка? и где я должен поместить это в код? - person JAHelia; 15.07.2012
comment
Он проверяет, была ли операция отменена, и в этом случае преждевременно завершает работу. - person esilver; 15.07.2012

Вот очень простая реализация, но найдите время, чтобы прочитать руководства, чтобы полностью понять все:

NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
    selector:@selector(methodToCall)
    object:objectToPassToMethod];

[queue addOperation:operation];
person Flea    schedule 27.03.2013

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

Зависимости позволяют вам выполнять несколько отдельных операций и обеспечивать выполнение и успешное выполнение или ошибку в определенном порядке. Это действительно здорово, когда вам нужно синхронизировать кучу данных, но вам нужно синхронизировать родительские объекты перед синхронизацией дочерних объектов.

person ddorrity    schedule 21.05.2013

Пример, который вы можете попробовать с помощью Swift

let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
person Govind    schedule 27.07.2014