Wiele klas dotykowych Cocoa Touch wykorzystuje wzorzec współwystępowania zdarzeń. UIViews
, na przykład, mają metodę setNeedsLayout
, która powoduje, że layoutSubviews
zostanie wywołana w najbliższej przyszłości. Jest to szczególnie przydatne w sytuacjach, w których wiele właściwości wpływa na układ. W ustawieniach dla każdej właściwości można wywołać [self setNeedsLayout]
, która zapewni aktualizację układu, ale zapobiegnie wielu (potencjalnie drogim) aktualizacjom układu, jeśli wiele właściwości zostanie zmienionych jednocześnie lub nawet jeśli pojedyncza właściwość została zmodyfikowana wiele razy w ciągu jednego iteracja pętli uruchamiania. Inne drogie operacje, takie jak para metod setNeedsDisplay
i drawRect:
, są zgodne z tym samym wzorcem.Zaimplementuj wzorzec rzucony/scalony w kakao Touch podobnie jak "layoutSubviews"
Jaki jest najlepszy sposób na wdrożenie takiego wzoru? W szczególności chciałbym powiązać wiele zależnych właściwości z kosztowną metodą, która musi zostać wywołana po zakończeniu iteracji pętli, jeśli właściwość uległa zmianie.
Możliwe rozwiązania:
Korzystanie z CADisplayLink
lub NSTimer
można dostać coś pracuje w ten sposób, ale oba wydają się bardziej zaangażowani, niż to konieczne i nie jestem implikacje wydajności dodając do tego pewności, co byłoby wiele obiektów (szczególnie timerów). W końcu wydajność jest jedynym powodem, aby zrobić coś takiego.
Użyłem coś takiego w niektórych przypadkach:
- (void)debounceSelector:(SEL)sel withDelay:(CGFloat)delay {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:sel object:nil];
[self performSelector:sel withObject:nil afterDelay:delay];
}
Działa to doskonale w sytuacjach, w których wejście użytkownik powinien wywołać tylko pewne zdarzenie, kiedy ciągłe działanie, czy takie rzeczy. Wydaje się, że przyziemne, gdy chcemy zapewnić, że nie ma opóźnienia w uruchomieniu zdarzenia, zamiast tego chcemy po prostu złączyć połączenia w ramach tej samej pętli uruchamiania.
Jeśli jesteś zainteresowany podjęciem akcji dokładnie w pętli, myślę, że chcesz [obserwatora pętli] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ Wielowątkowość/RunLoopZarządzanie/RunLoopManagement.html # // apple_ref/doc/uid/10000057i-CH16-SW22). Aby uzyskać szybki przykład, zobacz [Wybór selektora na początku/końcu pętli uruchamiania] (http://stackoverflow.com/q/16789342). –