簡體   English   中英

NSOperation在iPhone上

[英]NSOperation on the iPhone

我一直在尋找一些具體的場景,以確定iPhone上的NSOperation是否是在應用程序中使用的理想工具。 據我所知,這是編寫自己的threaded代碼的包裝器。 我還沒有看到任何使用它的Apple演示應用程序,我想知道我是否錯過了一個很棒的工具,而不是使用NSThread

這里理想的解決方案是描述NSOperation的用例場景以及如何使用它來解決您的問題。

Cocoa Is My Girlfriend有一個關於使用NSOperationNSOperationQueue好教程 本教程利用NSOperation在不同的線程中同時下載多個網頁。

另外,請參閱Mac Research的這篇文章

我在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,廣泛使用NSOperationNSOperationQueue來管理下載圖像和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM