В GCD есть ли способ узнать, является ли текущая очередь параллельной или нет? - PullRequest
3 голосов
/ 18 августа 2011

В GCD есть способ узнать, является ли текущая очередь параллельной или нет? В настоящее время я пытаюсь выполнить отложенное сохранение в некоторых контекстах управляемого объекта, но мне нужно убедиться, что очередь, в которой выполняется код, является поточно-ориентированной (в синхронной очереди).

Ответы [ 2 ]

4 голосов
/ 01 ноября 2011

Если вам действительно нужно определить, является ли переданная вам очередь последовательной или параллельной, вы почти наверняка спроектировали вещи неправильно. Как правило, API скрывает внутреннюю очередь как деталь реализации (в вашем случае контексты вашего общего объекта), а затем ставит операции в очередь против своей внутренней очереди для достижения безопасности потока. Однако, когда ваш API принимает блок и очередь в качестве параметров, тогда предполагается, что переданный блок может быть безопасно спланирован (асинхронно) для переданной очереди (когда, скажем, операция завершена), а остальная часть код корректируется соответствующим образом.

0 голосов
/ 18 августа 2011

Да, если вы выполняете работу в подклассе NSOperation :

[myOperation isConcurrent] //or self, if you're actually in the NSOperation

Если вам необходимо убедиться, что некоторые операции всегда выполняются синхронно, вы можете создать определенную очередь операций и установить для ее максимального числа одновременных операций значение 1.

NSOperationQueue * synchronousQueue = [[NSOperationQueue alloc] init];
[synchronousQueue setMaxConcurrentOperationCount:1];

GCD требует некоторого планирования. Единственный другой способ, которым я могу придумать, - это наблюдать значение isExecuting (или подобное) на ваших NSOperation объектах. Проверьте эту ссылку на этом. Это решение будет более сложным, поэтому я надеюсь, что другое будет работать для вас.

...