Załóżmy, że mam klasę o nazwie Person
, ze zmiennymi takimi jak firstName
i lastName
. Słucham zmian w tych zmiennych przy użyciu frameworka reactiveCocoa, ale załóżmy, że używam tylko wbudowanego słuchania KVO, jak na przykład didSet{}
. Zakładamy więc mam ten kod:Jak czekać na dany czas i wykonać tylko ostatnie wywołanie funkcji
let firstName:String { didSet{ self.nameDidChange() }}
let lastName: String { didSet{ self.nameDidChange() }}
func nameDidChange(){ print("New name:", firstName, lastName}
każdym razem chciałbym zmienić albo imię lub nazwisko, to automatycznie wywołać funkcję nameDidChange
. Zastanawiam się, czy jest tu jakiś sprytny ruch, aby zapobiec wywołaniu funkcji nameDidChange
dwa razy z rzędu, gdy zmienię zarówno firstName
, jak i lastName
.
Powiedzmy wartość w firstName
jest "Anders"
i lastName
jest "Andersson"
, a następnie uruchomić ten kod:
firstName = "Borat"
lastName = "Boratsson"
nameDidChange
zostanie wywołana dwukrotnie tutaj. Najpierw wydrukuje się "New name: Borat Andersson"
, a następnie "New name: Borat Boratsson"
.
W moim prostym umyśle, myślę, że mogę stworzyć funkcję o nazwie coś nameIsChanging()
, nazywają go, gdy którykolwiek z didSet
nazywa, i uruchomić stoper dla jak 0,1 sekundy, a następniewezwanie nameDidChange()
, ale oba z tych didSet
s również będą wywoływać nameIsChanging
, więc timer przejdzie dwa razy, i wystrzeli oba razy. Aby rozwiązać ten problem, mogłem zachować "globalny" Timer
i unieważnić go i zrestartować licznik lub coś podobnego, ale im więcej myślę o rozwiązaniach, tym brzydsze dostają. Czy są tutaj jakieś "najlepsze praktyki"?
Możesz dodać Bool, 'isChangingName', który jest domyślnie 'false' i ustawić w ten sposób w' nameDidChange' wtedy 'nameIsChanging' może użyć' guard' dla upewnienia się, że jest to 'false', ustaw' na 'true ', a następnie uruchom opóźnioną operację za pomocą timera lub' perform (, with:, afterDelay:) ' – theMikeSwan
Myślę, że powinieneś pamiętać, że dodając sztuczne opóźnienie, użytkownik może zinterpretować to jako" wolne "lub odłączone. Czy naprawdę istnieje potrzeba opóźnienia wywoływania funkcji? Jeśli wybierzesz trasę opóźnienia, powinna pojawić się * pewna * wizualna wskazówka, że aplikacja coś robi. – Zig
@Zig Potrzebuję tylko opóźnienia 0,01 sekundy, aby temu zapobiec, ponieważ będą one ustawione w tym samym czasie. Jest to możliwe tylko wtedy, gdy są ustawione programowo w tym samym czasie. Poza tym, potrzebuję ich, aby zadzwonili do funkcji, jeśli są również osobno zmienione. Ma to uniemożliwić każdemu z nich wysłanie żądania adresu URL, gdy nie jest ono potrzebne. – Sti