Ответ 1
setNeedsDisplay
не является хорошим примером того, что вы описываете, поскольку он действительно запускается каждый раз, когда вы его вызываете. Он просто устанавливает флаг. Но вопрос хороший.
Одним из решений является использование NSNotificationQueue с помощью NSNotificationCoalescingOnName
.
Другое решение - построить батут, чтобы выполнить объединение. У меня нет хороших ссылок на блоги для батутов, но вот пример одного (LSTrampoline). Это не так сложно построить, если вы хотите объединить сообщения в течение определенного периода времени. Я однажды построил батут с forwardInvocation:
, похожим на это:
- (void)forwardInvocation:(NSInvocation *)invocation {
[invocation setTarget:self.target];
[invocation retainArguments];
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeout invocation:invocation repeats:NO];
}
Это фактически объединяет все сообщения с объектом в течение периода времени (а не только для сопоставления сообщений). Это все, что мне нужно для конкретной проблемы. Но вы можете расширить это, чтобы отслеживать, какие селекторы объединяются, и проверьте свои призывы, чтобы убедиться, что они соответствуют "достаточно".
Чтобы запустить этот цикл в следующем цикле событий, установите время ожидания равным 0.
Я сохраняю смысл в блоге о батутах. Требуемый шиллинг: My предстоящая книга охватывает батуты в главе 4 и главе 20.