Bezdepbonusu7Программирование: статьи и ответы

Вопрос

NSOperation на iPhone

Автор вопроса: Coocoo4CocoaОтветов: 7

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

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

  • Возможно, вы захотите выбрать один из этих отличных ответов в качестве решения. (: corydoras 16.12.2009

iphonecocoa-touchobjective-cmultithreadingnsoperation

Ответы

Ответ 1 · рейтинг 43 · e.James

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

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

Ответ 2 · рейтинг 33 · nduplessis

То, как я использую его в своих приложениях для 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 · рейтинг 10 · Community

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

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

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

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

Ответ 4 · рейтинг 6 · esilver

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

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

if ( self.isCancelled ) return;

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

Ответ 5 · рейтинг 5 · Flea

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

NSOperationQueue *queue = [NSOperationQueue new];

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

[queue addOperation:operation];

Ответ 6 · рейтинг 1 · ddorrity

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

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

Ответ 7 · рейтинг 1 · Govind

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

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

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы