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.
Я продолжаю рассказывать о батутах. Обязательный шиллинг: Моя будущая книга посвящена батутам в главе 4 и главе 20.