Многие люди задают вопрос с похожим названием, но очень разные цели: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");
... за исключением того, что Apple, пошел и устаревшее dispatch_get_current_queue(), по-видимому «, потому что люди злоупотребляют его, чтобы вокруг не хватает функциональности в НОД/бит GCD, которые они не понимали ».
NB: мое использование dispatch_get_current_queue() выше, как представляется, является правильным и не оскорбительным, судя по комментарию заголовка Apple: все дело в том, что я проверяю, что очередь является частной, которую я создал (что утверждает Apple допустимое использование).
Оставляя в стороне мудрость обесценить что-то просто из-за недостатков в его реализации :(... кто-нибудь нашел обходное решение для этого, которое было удалено Apple. В частности: с CoreData вам нужно отслеживать очередь - есть ли другой способ сделать это?
(это важно, потому что: с помощью CoreData, если вы позволите чему-то случайно вызвать такой метод, вы не получите «краху», вы получите «повреждение данных», которое будет отображаться на . какой-то момент в будущем, когда уже слишком поздно, чтобы исправить это ")
Я использовал 'dispatch_queue_set_specific()' и 'dispatch_get_specific()' для приложения, которое я спросил здесь: http://stackoverflow.com/questions/12806506/how-can-i-verify-that- i-am-running-on-a-given-gcd-queue-without-use-dispatch-g, и он отлично работает, чтобы идентифицировать определенные очереди. В комментарии Джоди о ответе упоминается использование чего-то подобного в Core Data. –
@BradLarson dispatch_get_specific() очень интересно, спасибо. Я не уверен, что произойдет, если вы вызовете его, когда вы не находитесь внутри блока (в правильном исполнении вы бы это сделали, но я хотел бы знать, что происходит, когда он идет не так, потому что это настройка, которую я пытаюсь ловить/утверждать/лог против) – Adam
Я не знаю, что это в блоке. Все, что он тестирует, - это ключ, назначенный конкретной очереди, в которой этот код работает. Как я покажу там, я использую это для функции, которая гарантирует синхронное выполнение кода в конкретной очереди, либо путем синхронной отправки блока в очередь, либо путем непосредственного запуска кода, если он уже находится в этой очереди. –