2

Есть ли способ использования коаксиальных уведомлений на NSNotificationQueues для управления временным диапазоном?Coalescing NSNotifications

Я хотел бы объединить, например. в течение следующей секунды, но, насколько я понимаю, доступные варианты это либо сразу, либо в следующем вызове цикла запуска или «когда неактивен».

Любой другой способ, например. сливаются в течение более длительного времени?

Я в основном ищу способ собрать все пользовательские события (например, сжимать-на-зум) за небольшой промежуток времени и запустить дорогостоящую операцию только после того, как пользователь, по-видимому, прекратил масштабирование/etc.

ответ

0

Вы можете запланировать NSTimer, когда приходит первое уведомление. Когда приходит следующее уведомление, проверьте переменную экземпляра таймера. Если он не равен нулю, игнорируйте уведомление. В противном случае запустите новый таймер.

Когда таймер срабатывает, очистите переменную экземпляра таймера и запустите свою дорогостоящую операцию.

Более простая альтернатива заключается в использовании performSelector:afterDelay: и cancelPreviousPerformRequestsWithTarget:selector:object:. Однако эффект не тот. Вы будете откладывать свою дорогостоящую операцию каждый раз, когда будет получено уведомление. Если уведомления появляются быстрее, чем установленная задержка, дорогостоящая операция никогда не будет работать.

+0

Правильно, поэтому вы описываете 100% -ную пользовательскую реализацию. Конечно, это один из способов сделать это, но не связанный с использованием встроенного механизма коалесцирующих уведомлений. – ATV

+0

Да. Я не думаю, что встроенный коалесцент обеспечивает что-либо иное, чем «конец runloop» или «при простоя». Этого достаточно для большинства случаев. Если вы хотите, чтобы ваша дорогая операция срабатывала не чаще одного раза в секунду, вам, вероятно, придется реализовать это с помощью таймера. –