2013-02-15 82 views
0

我已經使用GCD之前的dispatch_async用於背景線程工作單元,比如解析來自網絡請求(例如JSON或XML)的數據,並且它是WONDERFUL。但是如果我有一個後臺任務要運行應用程序的長度呢? dispatch_async仍然適合這種情況,還是有更好的實施方法?適用於應用程序生命週期任務的GCD dispatch_async?

回答

3

當然,但創建你自己的調度隊列。 (如果你使用一個全球性的隊列,你可以佔用該隊列 - 或它的一個線程 - 永遠。)

dispatch_queue_t dispatchQueue = dispatch_queue_create("com.mycompany.myapp.ForeverOperation", DISPATCH_QUEUE_SERIAL); 
dispatch_async(dispatchQueue, ^{ 
    // worker routine 
}); 

更傳統,你會給這個明確的線索,如果將運行永遠,這可能會更「有意義」。但結果基本相同。

NSThread * myWorkerThread = [[NSThread alloc] initWithTarget:... 
[myWorkerThread start]; 

如果您需要與其他線程/隊列通信,像往常一樣,可能需要標準的同步技術。

+1

一些家庭作業表明,自定義隊列將默認將其目標隊列設置爲全局默認優先級隊列,這意味着提交給自定義隊列的工作將在全局默認隊列上執行。那麼,無論如何我將在全局執行時創建自定義隊列有什麼優勢? – 2013-03-26 20:08:50

1

這真的和dispatch_async無關,這只是在後臺線程中做某事的一種方法。如果您想在後臺線程中執行某些操作,請在後臺線程中執行此操作!請注意,經常這樣做會拖累你的應用程序,因爲你只有很多處理時間並且只有很多處理器;你最終可能不得不在Instrument中學習。你可能想把自己的任務分解成幾個小塊,並且每隔一段時間以短塊完成。 GCD和NSOperation都可以提供幫助。

相關問題