Я реализует механизм отслеживания оконного А следующие позиции окна B. Окно B представляемого события своей позиции и окна B реагирует на эти события, позвонив setWindowProperties
:Отменять предыдущий вызов dispatch_async
void setWindowProperties(bool topMost, bool visible,
CGWindowID parentWindow, CGWindowID aboveWindow,
NSRect windowFrame, NSRect viewFrame, bool isAbove)
{
dispatch_async(dispatch_get_main_queue(), ^{
setWindowPropertiesImpl(topMost, visible, parentWindow, aboveWindow, windowFrame, viewFrame, isAbove);
});
}
Но из-за слишком большого количества событий, отправленных окном B, я получаю эффект «отслеживания змеи». Я хочу, чтобы получить над ним путем взаимодействия только к последнему событию позиции, а это означает, отменяя весь предыдущий вызов:
dispatch_async(dispatch_get_main_queue(), ^{
setWindowPropertiesImpl(topMost, visible, parentWindow, aboveWindow, windowFrame, viewFrame, isAbove);
});
И как результат, в результате чего в очереди только последнее событие положения - только одно, что имеет значение ,
Мой вопрос: есть ли способ отменить все предыдущие звонки за dispatch_async
?
Технически задачи отправки теперь можно отменить (см. Обсуждение отмены в [Power, Performance and Diagnostics: Что нового в GCD и XPC] (https://developer.apple.com/videos/wwdc/2014/?id=716)). – Rob
@Rob Отмена имеет некоторые важные оговорки: блок не освобождается к моменту его отмены; Скорее, этот блок по-прежнему требуется для выполнения очереди, и когда он отменяется, он будет «проигнорирован» или «обойден» (скорее всего, блок встроен в некоторую функцию-обертку, которая проверяет флаг отмены). Это важно, так как только тогда, когда блок был запущен и выпущен, захватываемые объекты будут выпущены. Обратите внимание, что очереди могут быть приостановлены и могут содержать отмененные блоки. – CouchDeveloper
@CouchDeveloper Это поведение не уникально для GCD (например, если вы используете 'NSBlockOperation', вы увидите подобное поведение, если вы используете подкласс NSOperation, этот объект не будет освобожден при аннулировании, но только тогда, когда очередь дойдет до Это). Но это не имеет значения: я не пытался заявлять о каких-либо претензиях на отмену «за» и «против» в диспетчерах и операционных очередях. (На самом деле, я думаю, что вся идея OP о «очереди и отмене» для быстрых событий нецелесообразна.) Я просто указывал, что этот ответ, хотя и исторически правильный, больше не является верным. – Rob