2011-10-12 40 views
0

我知道的兩種方式來獲得一個操作隊列如下:的iOS開發約NSOperationQueue

queue1 = [[NSOperationQueue alloc] init]; 
queue2 = [[NSOperationQueue mainQueue] retain]; 

但我不知道他們之間有什麼區別。

[queue1 addOperation:operation1]; 
[queue2 addOperation:operation2]; 

哪個線程執行operation1?主線程?或不確定性?

我測試過了。

operation1 --> sometimes mainthread sometimes not. 
operation2 --> always mainthread. 

回答

1

According to the documentation NSOperationQueue的:

創建非並行操作單獨的線程,並從當前線程推出 併發操作。

這解釋了爲什麼你的一些任務在主線程上運行,而另一些任務沒有在主線程上運行。

mainQueue被綁定到主線程,所以操作總是在主線程上執行。

+0

關於'NSOperationQueue'的文檔已經過時了。 'NSOperation'的文檔指出,從Mac OS X 10.6(以及iOS 4.0)開始,所有操作都是從一個單獨的線程開始的,並且從'isConcurrent'返回的值將被忽略。 – omz

+0

該文檔還包括:在OS X中,但在_not_ iOS中,NSOperationQueues是使用GCD實現的:「因此,操作總是在單獨的線程上執行。我上面的報價在iOS特定部分。 (這在iOS5中可能會有所不同,我還沒有檢查過,也無法引用它。) –

+0

其實......我明白你的意思了。技術說明(https://developer.apple.com/library/prerelease/ios/#qa/qa1712/_index.html#//apple_ref/doc/uid/DTS40010262)表明iOS4 _does_使用GCD。 –

1

是的,斯蒂芬是正確的。

主要目的是爲非併發操作創建單獨的線程並從當前線程啓動併發操作。

在這種情況下

queue1 = [[NSOperationQueue alloc] init]; 

的隊列1是屬於從中援引即,如果上面的線從一個分離的線程調用那就不是屬於主線程的線程隊列中。

queue2 = [[NSOperationQueue mainQueue] retain]; 

您在外部獲取從換句話說的IOS隊列第一是本地的調用,並且第二個中的VC /類是全局的(一個用於在IOS 4中的一個應用程序)