Хотя я далеко не эксперт по параллелизму, для меня это звучит так, будто вам нужен замок на вашем sortedKeys
объекте.Однако если бы вы использовали традиционную блокировку, вы бы в конечном итоге заблокировали основной поток.
Рекомендуемая замена блокировок в мире Grand Central Dispatch - поместить критические участки кода в последовательную очередь.См. «Устранение кода на основе блокировки» в Руководстве по программированию параллелизма.
Если вы поместите вызов [self.sortedKeys removeAllObjects];
в ту же очередь, в которой запланирован блок с вызовом internal...
, вы гарантируете, что этого не произойдет, пока этот блок не завершится:
// start critical area
dispatch_async(self.filterMainQueue, ^{
if (self.sortedKeys.count != 0) {
[self.sortedKeys removeAllObjects];
}
});
Предполагается, что filterMainQueue
это serial .Использование dispatch_async
для критической секции гарантирует, что основной поток не будет заблокирован.Также обратите внимание на предупреждение в «Очереди отправки и безопасность потока» :
Не вызывайте функцию dispatch_sync
из задачи, которая выполняется в той же очереди, которую вы передаетеВаш вызов функции.Это приведет к блокировке очереди.
Хотя это будет проблемой, только если метод internal...
сделает что-то, что вызовет этот метод снова.