Добавление предупреждения (которое в конечном итоге является аргументом для очередей отправки) к предыдущим ответам.
Вы должны быть осторожны с тем, как вызываются очереди отправки, поскольку есть некоторые скрытые сценарии, которые не были очевидны для меня сразу, пока я не столкнулся с ними.
Я заменил NSLock и @synchronized на ряде критических секций с очередями отправки с целью облегченной синхронизации. К сожалению, я столкнулся с ситуацией, которая приводит к тупику, и я вернул его обратно к использованию шаблона dispatch_barrier_async / dispatch_sync. Казалось бы, dispatch_sync может случайно вызвать свой блок в главной очереди (если он уже выполняется там), даже когда вы создаете параллельную очередь. Это проблема, поскольку dispatch_sync в текущей очереди отправки вызывает тупик.
Полагаю, я буду двигаться в обратном направлении и использовать другую технику блокировки в этих областях.