2009-05-06 2 views
41

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

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

+22

Вы можете рассмотреть вопрос о выборе одного из этих отличных ответов как решение. (: – corydoras

ответ

43

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

Также см. this article от Mac Research.

+0

Здесь есть еще один учебник: http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/ – wbyoung

+0

Я также предлагаю перейти к материалам Standord Class. Они широко используют NSOperation для асинхронных загрузочных изображений в примере flickr. Они доступны в iTunes бесплатно. – Jab

10

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

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

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

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

+2

На самом деле это не * действительно * потокобезопасно, есть проблема с ним в Mac OS X 10.5. См. http://www.mikeash.com/?page=pyblog/dont-use-nsoperationqueue.html. Хотя они упоминают, что iPhone, похоже, невосприимчив к нему из-за одноядерного процессора – nduplessis

+2

Как обновление, http://www.mikeash.com/pyblog/use -nsoperationqueue.html был продолжением ссылки в комментарии от @nduplessis, в которой отмечается, что 10.5.7 исправили упомянутые проблемы. Таким образом, NSOperationQueue, вероятно, теперь является потокобезопасным. –

33

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

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

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

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

if (self.isCancelled) return; 

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

+0

вы можете объяснить, что именно делает эта строка ? и где я должен положить это в коде? – JAHelia

+1

Он проверяет, была ли операция отменена и выйдет раньше, если это так. – esilver

5

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

NSOperationQueue *queue = [NSOperationQueue new]; 

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

[queue addOperation:operation]; 
1

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

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

1

образец, который вы можете попробовать использовать Swift

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

let operationQueue = NSOperationQueue.mainQueue() 
operationQueue.addOperation(operation) 
Смежные вопросы