NSOperation на iPhone
Я искал некоторые конкретные сценарии, когда NSOperation
на iPhone - идеальный инструмент для использования в приложении. Насколько я понимаю, это оболочка для написания собственного кода threaded
. Я не видел ни одного приложения для демонстрации в Apple, и мне интересно, не упустите ли я отличный инструмент вместо использования NSThread
.
Идеальное решение здесь - описать сценарий использования для NSOperation
и как вы будете использовать его для решения своих проблем.
Ответы
Ответ 1
Cocoa У моей подруги есть хороший учебник об использовании NSOperation
и NSOperationQueue
. В учебнике используется NSOperation
для загрузки нескольких веб-страниц одновременно в отдельных потоках.
Также см. эту статью от Mac Research.
Ответ 2
То, как я использую его в своих iPhone-приложениях, заключается в том, чтобы в основном создать член NSOperationQueue в моем делете приложения и сделать его доступным через свойство. Затем каждый раз, когда мне нужно что-то запускать в фоновом режиме, например. загрузите некоторый XML. Я просто создам NSInvocationOperation и отправлю его в очередь.
NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];
Ответ 3
Одним словом: NSOperationQueue
NSOperationQueue
является потокобезопасным (вы можете добавлять к нему операции из разных потоков без необходимости блокировок) и позволяет вам объединять объекты NSOp вместе.
My Flickr iPhone app, Reflections, использует NSOperation
и NSOperationQueue
для управления загрузкой изображений и XML
.
Предостережение. Убедитесь, что вы читаете, перечитываете и понимаете, что означают документы, когда они говорят о "concurrency".
Ответ 4
Вы также должны проверить этот URL:
http://developer.apple.com/cocoa/managingconcurrency.html
Все эти ответы являются замечательными, но убедитесь, что вы прочитали статью выше и сделали либеральное использование этой строки в вашем коде:
if ( self.isCancelled ) return;
Эта строка не использовалась в образцах, предоставленных Coca - моя подруга, и только после того, как я получил журналы сбоев, я понял, что это проблема/концепция.
Ответ 5
Вот только очень простая реализация, но у вас есть время, чтобы прочитать учебники, чтобы полностью понять все:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(methodToCall)
object:objectToPassToMethod];
[queue addOperation:operation];
Ответ 6
Я использую его для асинхронной обработки. Это лучший способ получить данные из веб-служб или для координации действий, требующих значительного времени для запуска. Поскольку они потокобезопасны, асинхронны (не привязывают основной поток), и они поддерживают зависимости, они являются действительно отличным инструментом для вашего набора инструментов.
Зависимости позволяют сделать несколько отдельных операций и убедиться, что выполнение и успешное выполнение или ошибка в определенном порядке. Это действительно здорово, когда вам нужно синхронизировать кучу данных, но вам нужно, чтобы родительские объекты синхронизировались до синхронизации дочерних объектов.
Ответ 7
Образец, который вы можете попробовать использовать Swift
let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)