NSOperation на iPhone - PullRequest
       18

NSOperation на iPhone

41 голосов
/ 06 мая 2009

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

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

Ответы [ 7 ]

43 голосов
/ 06 мая 2009

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

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

33 голосов
/ 07 мая 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];
10 голосов
/ 07 мая 2009

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

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

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

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

6 голосов
/ 09 июня 2011

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

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

if ( self.isCancelled ) return;

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

5 голосов
/ 27 марта 2013

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

NSOperationQueue *queue = [NSOperationQueue new];

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

[queue addOperation:operation];
1 голос
/ 27 июля 2014

Образец, который вы можете попробовать с помощью Swift

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

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
1 голос
/ 22 мая 2013

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

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

...