Подтвердить что ты не робот

NSOperation на iPhone

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

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

4b9b3361

Ответ 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)