Ответ 1
Как и в большинстве хакеров NSOperationQueue
, вы можете использовать поддержку зависимостей между операциями:
- Создайте подкласс
NSBlockOperation
,ReaderWriterBlockOperation
. Добавьте к нему свойствоBOOL writer
. - Создайте очередь операций для каждого защищенного ресурса.
- Остановить показ вашей очереди операций клиентам. Вместо этого выведите API
-readWithBlock:
и-writeWithBlock:
. Обе помещают вReaderWriterBlockOperation
, один сwriter == NO
, другой== YES
. Их работа управляет зависимостями следующим образом:-
-readWithBlock:
делает в блоке@synchronized(self)
проверку операций от последнего до первого поиска блока записи. Если ни один не найден, он добавляет операцию и возвращает. Если он найден, он заставляет новый блок считывателя зависеть от писателя, завершает его и возвращает. -
-writeWithBlock:
делает то же самое. За исключением случаев, когда в операциях, находящихся в очереди, не обнаружено ни одного писателя, это заставляет блок зависеть от всех найденных читателей. Если он находится в операциях с очередью, он зависит от этой операции и всех последующих (считывающих) операций.
-
Это должно быть результатом блокировки всех читателей до тех пор, пока автор не завершит их до конца и не заблокирует всех авторов до тех пор, пока читатели не завершат их.
Одна из возможных проблем: я неясен (потому что документы не ясны, и я еще не реализовал это как таковые), если NSBlockOperation
на самом деле ждет завершения своего блока до того, как объявит о завершении. Если это не так, вам нужно будет управлять этим самостоятельно в подклассе операции.
Все, что сказано, если система предоставляет рабочее решение, например барьерные блоки, вы должны это использовать. Вся эта система является взломом, чтобы получить очередь операций, чтобы сделать что-то, что очереди отправки были настроены для обработки очень хорошо. Если производительность на самом деле не вызывает беспокойства, то почему бы просто не использовать последовательную очередь (NSOperationQueue
с максимальным количеством совпадающих операций == 1)?