我以後就用NSOperation
和繪製一些建議:NSOperation阻止UI繪畫?
我有一個主線程創建我NSOperation
子類,然後把它添加到一個NSOperationQueue
。
我NSOperation
做一些繁重的處理,它的目的是在main()方法循環幾分鐘,不停地處理一些工作,但現在我只是有一個while()循環與睡眠(1)內,這是設置爲五次左右(用於測試)。
主要(原)螺紋,其派生此NSOperation
負責繪製到一個視圖和更新UI。
我打算讓NSOperation線程使用一個通知來告訴主線程它已經完成了一些處理,此時通知每次發送一次while()循環(即循環)。每秒一次,因爲它只是在睡覺(1))。主線程(視圖)註冊以接收這些通知。
的通知通過立即主線程和異步似乎,看着就好了。看來,兩個線程按預期運行......這是 - 併發。 (我使用NSLog()來粗略地檢查每個線程何時發送和接收通知)。
當視圖收到通知時,和其處理程序被調用時,我簡單地遞增的整數變量,並嘗試並繪製這個到視圖(當然是一個字符串)。在測試中,drawRect中的代碼:將該整數(作爲字符串)繪製到屏幕上。
但是:這是我的問題(對不起,它需要一點時間來到這裏):當主線程(視圖)從NSOperation收到通知時,它會更新此測試整數並調用[self setNeedsDisplay]。但是,直到NSOperation完成之後,視圖纔會重新繪製!我預計的NSOperation,作爲一個單獨的線程,就沒有能力阻止主線程的事件循環,但現在看來,這是發生了什麼。當NSOperation完成並且main()返回時,視圖最終會立即重繪。
也許我沒有使用正確NSOperation
。我在「非併發」模式下使用它,但儘管名字我的理解是,這仍然產生一個新的線程,並允許異步處理。
任何幫助或建議大加讚賞,如果你想看到一些代碼,只是讓我知道。
如果你願意,你可以直接從你的NSOperation主要方法中執行(performSelectorOnMainThread:withObject:waitUntilDone :) - 沒有任何通知的東西。 – grzaks 2010-09-24 17:48:16