[英]NSOperation on the iPhone
我一直在尋找一些具體的場景,以確定iPhone上的NSOperation
是否是在應用程序中使用的理想工具。 據我所知,這是編寫自己的threaded
代碼的包裝器。 我還沒有看到任何使用它的Apple演示應用程序,我想知道我是否錯過了一個很棒的工具,而不是使用NSThread
。
這里理想的解決方案是描述NSOperation
的用例場景以及如何使用它來解決您的問題。
我在iPhone應用程序中使用它的方法是在我的應用程序委托中基本創建一個NSOperationQueue成員,並通過屬性使其可用。 然后每當我需要在后台運行某些東西時,例如下載一些XML,我只需創建一個NSInvocationOperation並將其發送到queque。
NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];
總之一句話: NSOperationQueue
NSOperationQueue
是線程安全的(您可以從不同的線程向其添加操作而無需鎖定),並使您能夠將NSOp對象鏈接在一起。
我的Flickr iPhone應用程序Reflections,廣泛使用NSOperation
和NSOperationQueue
來管理下載圖像和XML
。
警告:確保您在閱讀“並發”時閱讀,重新閱讀並理解文檔的含義。
您還應該查看此URL: http : //developer.apple.com/cocoa/managingconcurrency.html
以上所有答案都很棒,但請確保您閱讀上面的文章並在代碼中自由使用此行:
if ( self.isCancelled ) return;
在Coca提供的樣本中沒有使用該行是我的女朋友,直到我從現場獲得崩潰登錄才知道這是一個問題/概念。
這是一個非常簡單的實現,但需要時間閱讀教程以完全理解所有內容:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(methodToCall)
object:objectToPassToMethod];
[queue addOperation:operation];
我用它進行異步處理。 這是從Web服務獲取數據或協調需要大量時間運行的操作的最佳方法。 因為它們是線程安全的,異步的(不占用主線程)並且它們支持依賴性,所以它們對於您的工具集來說是一個非常好的工具。
依賴關系允許您進行多個單獨的操作,並確保以特定順序執行並成功或錯誤輸出。 當您需要同步一堆數據但在同步子對象之前需要同步父對象時,這非常好。
您可以嘗試使用Swift的示例
let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.