2010-05-17 52 views
2

想象一下,我有一些UIKit的對象作爲子視圖的視圖(例如,UIActivityIndicatorView - 這並不重要)。該視圖還有一個名爲doSomething的選擇器,它以某種方式管理UIKit對象(在我們的示例中,它可以啓動或停止指示器視圖)。NSInvocationOperation和主線程

創建NSInvocationOperation(從視圖的代碼部件)與initWithTarget:self selector:@selector(doSomething) object:nil。然後將其添加到NSOperationQueue。一切正常。

怎麼樣?它應該是一個新的線程和非線程安全的UIKit對象!爲什麼沒有發現錯誤(並且沒有發生崩潰)?

回答

15

NSInvocationOperation類是NSOperation的具體子類implements a non-concurrent operation

在非併發操作,the operation’s task is performed synchronously,也就是說,操作對象不創建在其上運行任務的一個單獨的線程。因此,當調用非併發操作的start方法時,該操作立即在當前線程中執行。當這樣一個對象的方法返回到調用者的控制時,任務本身就完成了。

但是,使用NSOperationQueue改變了這種行爲。 NSOperationQueue總是同時執行操作;一個非併發操作需要一個單獨的線程才能併發執行,並且NSOperationQueue提供了這個線程。

這意味着如果您直接執行NSInvocationOperation,您將能夠以線程安全的方式訪問UIKit對象(該操作將在同一個線程中運行)。就你而言,如果使用NSOperationQueue,則應使用調用選擇器中的NSObject performSelectorOnMainThread:withObject:waitUntilDone:來安排在主線程上使用UIKit對象的工作。

+1

好的,這是一個很好的答案! +1 – 2010-05-17 05:42:02