2016-06-22 3 views
3

У меня есть длинные задачи, которые будут выполняться в очереди фона, последовательно.GCD Асинхронная, последовательная очередь - можно ограничить размер очереди?

Одним из особых требований является то, что я хочу, чтобы максимальный размер очереди был 1, и для него это LIFO.

Итак, если во время работы выполняется N элементов, я хочу, чтобы все они были удалены. ЗА ИСКЛЮЧЕНИЕМ последнего. Подобно тому, как работает «debounce».

+0

Будет ли макс-куча работать для ваших целей? – JaredH

+0

вы можете отменить все операции в вашей операцииQueue перед добавлением нового блока: [operationQueue cancelAllOperations]; [operationQueue addOperation: myblockOperation]; – Idali

ответ

2

Этот тип вещей обычно делается с источником DISPATCH_SOURCE_TYPE_DATA_OR в GCD. Это объединяет несколько запросов (вызванных через dispatch_source_merge_data()) в один вызов обработчика события источника.

Ограничено до 64 бит «полезной нагрузки», извлекаемых с помощью dispatch_source_get_data(), (атомарно ORed вместе из всех значений, переданных в merge_data(), которые были объединены в этот конкретный вызов обработчика).

В качестве альтернативы источник DATA_ADD может использоваться, чтобы просто подсчитать, сколько запросов было объединено в один вызов обработчика.

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

Смежные вопросы