До сих пор я прошел через документ GCD, но кажется, что там пропускает dispatch_cancel(), который я хочу использовать, чтобы отменить все вызовы блоков отправки. Есть ли способ реализовать dispatch_cancel()?Есть ли способ реализовать dispatch_cancel()?
ответ
GCD не реализует API отмены, поскольку он не был бы безопасным (он мог бы прервать работу в середине). Если вы хотите отменить задачи, вам нужно сделать это самостоятельно, выполнив «отмененный» логический процесс и проверив его в своих задачах, когда они начнутся, а затем периодически.
Как упоминает @HampusNilsson, вы не можете разумно отменить любую операцию в полете в среде, не связанной с мусором (например, это), потому что она по своей сути будет утечка ресурсов и оставит процесс в неопределенном состоянии. NSOperationQueue
имеет API отмены, и этот API может использоваться для осуществления отмены операций в полете, при условии, что сами операции совместно проверяют флаг, а затем очищают и возвращают на ранней стадии. Это не правда, трудно прервать.
Что касается отмены рабочих элементов, но не начатых, да, NSOperationQueue
справляется с этим, но это происходит за счет дополнительных расходов, а NSOperationQueue
- это более высокий уровень абстракции. Производительность GCD в основном основывается на внутреннем использовании незакрепленных очередей. Остановка без блокировки будет быстрее, чем реализация на основе блокировки, но для достижения этой скорости потребуются определенные компромиссы. Например, я ожидал бы, что будет намного сложнее произвольно мутировать очередь в режиме блокировки, чтобы удалить отмененную операцию. Я подозреваю, что ограничение операций открытой очереди на «только в очереди» и создание неизменяемых рабочих элементов (блоки и функции ptrs) открыло дверь для многих оптимизаций, которые позволяют GCD иметь такие небольшие накладные расходы и работать так хорошо.
FWIW, в общем случае, операции по отмене транзакции довольно тривиальны для реализации поверх существующего API GCD, поэтому любой, кто нуждается в этой функции, может довольно легко сделать это сам (и, вероятно, таким образом, что это лучше подходит к их конкретным потребностям, чем обобщенный API). Рассмотрим следующую функцию - он ставит в очередь блок в очереди и возвращает блок, который вы могли бы назвать позже отменить операцию: в очереди
dispatch_block_t dispatch_cancelable_async(dispatch_queue_t q, dispatch_block_t b)
{
__block uintptr_t isCancelled = 0;
dispatch_async(q, ^{
if (!isCancelled) b();
});
return [[^{ isCancelled = 1; } copy] autorelease];
}
Это не будет правильным методом отмены для каждого случая, но это достойное первое приближение.
«Используйте абстракцию высочайшего уровня, которая выполняет свою работу». Если вы хотите отменить, и разница в накладных расходах между NSOperationQueue
и GCD не является существенным фактором, вы должны просто использовать NSOperationQueue
. Некоторые даже догадываются, что использование NSOperationQueue
является более идиоматическим выбором при работе в Objective-C. Помимо этого, реализация отмены без отмены для общего случая поверх GCD является, как показано, достаточно тривиальной.
Исходя из всего этого, мое подозрение в том, что здание в отмене API не было целесообразным компромиссом с точки зрения производительности и сложности.
с прошивкой 8 и выше, вы можете отменить выполнение блока с
dispatch_block_cancel
dispatch_block_t blockTask = dispatch_block_create(0,{
//do some task
});
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,5*NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),blockTask);
dispatch_block_cancel(blockTask);
- 1. Есть ли лучший способ реализовать?
- 2. Есть ли более простой способ реализовать openid?
- 3. Есть ли способ реализовать SSO перед микросервисами?
- 4. Есть ли способ реализовать функцию в Oracle?
- 5. Есть ли способ реализовать слои в GDI +?
- 6. Есть ли способ реализовать минимальную/максимальную очередь?
- 7. Есть ли способ реализовать поиск в Twitter?
- 8. Есть ли способ реализовать всю среду разработки?
- 9. indexOf(): есть ли лучший способ реализовать это?
- 10. Android-Html: Есть ли способ реализовать спойлеры?
- 11. Есть ли способ реализовать «n-month» масштабирование/уменьшение в Highcharts?
- 12. Есть ли способ реализовать кнопку DataGridView SaveItem без использования TableAdapters?
- 13. Есть ли хороший способ реализовать интерфейс шаблона в C++?
- 14. Есть ли способ заставить класс C# реализовать определенные статические функции?
- 15. Есть ли лучший способ реализовать диалог с react.js?
- 16. Есть ли способ реализовать функциональность MaintainScrollPositionOnPostBack в jQuery
- 17. Есть ли способ реализовать шаблон основного кода в WCF?
- 18. Есть ли способ динамически реализовать интерфейсы в Java?
- 19. Есть ли способ реализовать верхний вниз скользящий выдвижной ящик
- 20. Есть ли только один способ реализовать алгоритм сортировки пузырьков?
- 21. Android: Есть ли способ реализовать сканер штрих-кода в приложении?
- 22. Есть ли способ реализовать Passthrough Publisher в Rebus?
- 23. Есть ли способ реализовать подстановочный метод с функцией «найти»?
- 24. Есть ли способ реализовать showSoftInputOnFocus в Android для API 14?
- 25. Есть ли лучший способ реализовать метод Remove для очереди?
- 26. Есть ли простой способ реализовать LINQ для объекта с DataContext?
- 27. Есть ли способ реализовать богатое текстовое поле в угловом 2?
- 28. Есть ли лучший способ реализовать несколько @ font-faces?
- 29. Есть ли правильный способ реализовать непрерывное совершенствование (программное упрочнение AKA)?
- 30. Есть ли способ реализовать функцию ожидания/ожидания в AFrame?
Я знаю, что вы имеете в виду небезопасно, но NSOperationQueue поддерживает «отмена», чтобы отменить эти блоки еще не начали. очередь отправки должна поддерживаться, как эта функция, почему бы и нет? – Richard