2012-08-09 207 views
2

使用我使用這個代碼:哪個隊列GCD

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

dispatch_async(queue, ^{ 

//saving stuff to NSUserDefaults 

}); 

它的工作原理,只要在快速連續的代碼不叫兩次,在這一點上,我得到一個崩潰。所有它說的是Thread 7: trace的崩潰,在屏幕上爲CFRetain

我猜我的隊列不應該允許重新啓動這個例程,除非它已經完成。但我不確定要改變的參數中的哪一個。我不需要它是高優先級的,我也不確定它是否需要成爲全局隊列,說實話,線程編程需要一些時間讓我指出所有這些,所以我希望有人能指出我在正確的方向。

+0

只是猜測,嘗試調用不同的隊列類型。 – Dustin 2012-08-09 13:35:29

回答

2

如果您希望此操作在同一個隊列異步但始終運行(意思是:這是一個在後臺完成,但從來沒有兩次在同一時間),我建議你創建你的類dispatch_queue_t(或地方訪問全球 ,外法):

這會是這樣的:

@interface Foo : Bar { 

    @private 
    dispatch_queue_t _savingQueue = dispatch_queue_create("savingQueue", NULL); 

} 

-(void)saveStuff; 

@end 

,並始終保存在該隊列

-(void)saveStuff{ 

    dispatch_async(_savingQueue, ^{ 

    //saving stuff to NSUserDefaults 

    }); 

} 
+0

這是有道理的,只是你的'dispatch_queue_create'應該指定它是一個串行隊列,如果你不想同時運行兩次任務,對吧?你已經通過'NULL',這不是我認爲的最佳選擇。 – johnbakers 2012-08-11 04:32:44

+0

我現在看到NULL的結果是默認的,這確實是串行的。非常感謝。 – johnbakers 2012-08-11 04:33:42

3

全局隊列爲固有併發。當你對這些隊列使用dispatch_sync()時,它僅僅意味着該功能將在塊完成執行時返回。它確實而不是保證該隊列上的塊不會同時運行。

創建串行隊列(帶有串行選項的dispatch_queue_create())並將塊分派到其上。注意不要將disptch_sync()從運行在該隊列中的塊放到隊列中;僵局隨之而來。

+0

關於線程編程的各種Apple文檔,您認爲最好的讀法是什麼或其他資源? – johnbakers 2012-08-10 14:35:00

+0

我會從這裏開始http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html然後分支出技術特定的註釋或指南。 – bbum 2012-08-11 03:18:07