2014-02-14 75 views
1

我在我的可可應用程序中有2個窗口。主窗口打開一個子窗口。在子窗口上點擊OK,我在主窗體上調用一個確認按鈕,這將顯示在子窗口上單擊確定按鈕。實現後臺工作 - Obj C /可可

現在,我需要在主窗口上「在後臺」運行一個長時間運行的進程,以便窗口不會變得沒有響應。我也有進度條,應該顯示這個長時間運行過程的進度。

請讓我知道,達到此目的的最佳方法是什麼。

回答

4

您可以使用Grand Central Dispatch爲此。首先創建一個調度隊列,它將包含您想要在另一個線程上執行的操作。每個操作都表示爲一個Objective-C塊(關閉)。

首先你得到一個隊列來把你想在另一個線程上運行的任務。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

然後你把一個塊表示要在這個隊列中所做的工作:

dispatch_async(queue, ^{ 
    // this happens on separate thread 
    NSImage *image = produceImageFromSomeReallySlowOperation() 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // this happens on main thread 
     [myView setImage:image]; 
    }); 

}); 

dispatch_get_main_queue()函數會返回一個用於操作的主線程(在GUI是隊列執行)。這意味着[myView setImage:image]將在主線程上執行。您可以在此處放置進度條的更新。只需在主隊列上調度即可更新算法中每個點的進度,這樣做有意義。

所有這些也可以使用NSOperation來執行,它爲相同的功能提供更高級的Objective-C接口。但直接使用GCD有時更容易。這取決於你想要做什麼。

+1

Apple建議您始終使用API​​的最高級別抽象,除非您需要僅由較低級別的API提供的特定行爲。所以你應該真的推薦NSOperationQueue – Tim

+1

@Jeff:'NSOperationQueue'是一個整潔的類,但GCD同樣是多功能的,我認爲它也更容易跳到。 'NSOperationQueue'需要一些練習,有時會以我的經驗爲新用戶拉頭髮。 – SevenBits

+0

@SevenBits有趣的是你有相同的經歷。我還發現NSOperation更難推理。儘管NSOperation較高,但它的年齡較大,所以我認爲GCD設計得更好是有道理的,因爲它是一種更新的API,具有事後的好處。 –