很多人問類似標題的問題,而是非常不同的目的:dispatch_get_current_queue()已棄用,是否有替代安全的CoreData?
CoreData 要求你跟蹤當前隊列,你當前線程,和您當前的NSOperationQueue的(如果你是一個的NSOperation) ,如果你允許方法調用來自其他類(默認情況下,每個類都允許)。對此沒有「可能」:這是一個很難的要求。
這很好,一般可以很容易地保證:
NSAssert([NSThread currentThread].isMainThread || myPrivateQueue == dispatch_get_current_queue(), @"You tried to call this method from an external thread, or a queue other than my internal private queue. That's not legal, and will cause data corruption");
...除了蘋果已經和過時dispatch_get_current_queue(),顯然是「因爲人們濫用它避開缺少的功能在GCD /他們不瞭解的GCD位「。
注意:通過蘋果的頭文件評論,我對上面的dispatch_get_current_queue()的使用看起來是正確的和非濫用的:整個觀點是我檢查隊列是我創建的私人隊列(Apple聲稱是可以接受的用法)。
撇開一些貶低某些東西的智慧,僅僅是因爲它的實現中存在一些缺陷:(......有人找到了解決方法,被蘋果公司刪除了)具體來說:使用CoreData,你必須跟蹤隊列 - 是否有另一個這樣做的方式是什麼?
(這個問題很重要,因爲:使用CoreData,如果你允許一些意外調用這種方法,你不會得到「崩潰」,你會得到「數據損壞,將顯示在在未來的一些時候,修復它已經太遲了「)
我一直在使用'dispatch_queue_set_specific()'和'dispatch_get_specific()',我在這裏詢問的應用程序:http://stackoverflow.com/questions/12806506/how-can-i-verify-that-我正在運行一個給定的gcd-queue-without-using-dispatch-g,它一直在很好地識別特定的隊列。 Jody對答案的評論提到了在Core Data中使用類似的東西。 –
@BradLarson dispatch_get_specific()非常有趣,謝謝。我不確定當你不在一個區塊內時調用它會發生什麼(正確執行時,你會這樣做,但是我想知道當它出錯時會發生什麼,因爲這是我嘗試的設置以捕捉/斷言/反對) – Adam
我不知道在一個塊的事情。它所測試的所有內容都是分配給此代碼運行的特定隊列的密鑰。正如我在那裏展示的那樣,我使用這個函數來保證特定隊列上的代碼的同步執行,或者通過同步分派一個塊到隊列中,或者通過直接運行代碼(如果已經在該隊列中)。 –