2009-05-06 60 views
41

我一直在尋找一些具體的場景,當iPhone上的NSOperation是一個理想的工具在應用程序中使用。據我的理解,這是一個圍繞你自己的threaded代碼的封裝。我還沒有看到任何蘋果演示應用程序使用它,我想知道如果我錯過了一個偉大的工具,而不是使用NSThreadNS操作iPhone

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

+22

樣品您可能要考慮選擇這些優秀的答案,作爲解決方案之一。 (: – corydoras 2009-12-16 03:21:19

回答

43

可可是我的女朋友有good tutorial使用NSOperationNSOperationQueue。本教程利用NSOperation在不同的線程中同時下載幾個網頁。

另外,參見Mac Research的this article

+0

這裏還有另一個教程:http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/ – wbyoung 2009-05-06 21:17:40

+0

我還建議重寫Standord Class教材,他們廣泛使用NSOperation到flickr例子中的異步加載圖像,它們可以在iTunes上免費獲得 – Jab 2009-05-07 15:00:29

10

一句話:NSOperationQueue

NSOperationQueue是線程安全的(你可以從不同的線程添加進行操作即可,而不需要鎖),使您能夠鏈NSOP對象在一起。

我的Flickr iPhone應用程序Reflections使用NSOperationNSOperationQueue廣泛地管理下載圖像和XML

警告:確保您閱讀,重新閱讀並瞭解文檔在討論「併發性」時的含義。

+2

實際上,它不是*真正*線程安全的,它在Mac OS X 10.5上有問題,請參閱http://www.mikeash.com儘管他們提到iPhone似乎是免疫的,因爲單核心處理器 – nduplessis 2009-05-07 08:52:11

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

你也應該看看這個網址: 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]; 
1

我用它異步處理。這是從Web服務獲取數據或協調需要大量時間運行的操作的最佳方式。因爲它們是線程安全的,異步的(不會捆綁主線程),並且它們支持依賴關係,所以它們對於您的工具集來說是非常棒的工具。

依賴性允許您進行多個獨立的操作,並確保以特定順序執行併成功或出錯。當你需要同步一堆數據時,這非常棒,但在同步子對象之前需要父對象進行同步。

1

,你可以嘗試使用雨燕

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

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