В GCD есть ли способ определить, является ли текущая очередь параллельной или нет? В настоящее время я пытаюсь выполнить отложенное сохранение в некоторых контекстах управляемых объектов, но мне нужно убедиться, что очередь, в которой в данный момент выполняется код, является потокобезопасной (в синхронной очереди).
В GCD есть ли способ определить, является ли текущая очередь параллельной или нет?
Ответы (2)
Если вам действительно нужно определить, является ли переданная вам очередь последовательной или параллельной, вы почти наверняка спроектировали что-то неправильно. Как правило, API скрывает внутреннюю очередь как деталь реализации (в вашем случае контексты общих объектов), а затем ставит операции в очередь для своей внутренней очереди, чтобы обеспечить безопасность потоков. Однако, когда ваш API принимает блок и очередь в качестве параметров, предполагается, что переданный блок может быть безопасно запланирован (асинхронно) для переданной очереди (когда, скажем, операция завершена), а остальная часть код учитывается соответствующим образом.
Да, если вы выполняете работу в NSOperation:
[myOperation isConcurrent] //or self, if you're actually in the NSOperation
Если вам нужно, чтобы некоторые операции всегда выполнялись синхронно, вы можете создать конкретную очередь операций и установить для нее максимальное количество одновременных операций равным 1.
NSOperationQueue * synchronousQueue = [[NSOperationQueue alloc] init];
[synchronousQueue setMaxConcurrentOperationCount:1];
GCD требует некоторого планирования заранее. Единственный другой способ, который я могу придумать, - это наблюдать значение isExecuting
(или подобное) на ваших объектах NSOperation
. Ознакомьтесь с эта ссылка на это. Это решение будет более сложным, поэтому я надеюсь, что другое сработает для вас.
Operation.isConcurrent
/asyncronous
не имеет ничего общего с тем, есть ли у OperationQueue
, выполняющего операцию, параллельная базовая очередь.
- person jaetzold; 08.02.2019