Po kilku dniach bez odpowiedzi uruchomiłem kilka eksperymentów. Nawiasem mówiąc, testy te są przeprowadzane na symulatorze, a nie na rzeczywistym urządzeniu, ale myślę, że byłoby to takie samo.
Pierwszy test, ustawiam punkt przerwania w debugerze na touchesBegan
i sprawdzam śledzenie stosu. Wygląda na to, że touchesBegan
jest wywoływane z pierwszego wątku i z pętli main
- to samo miejsce, co reszta logiki, więc dobrze wygląda to dla pojedynczego wątku.
Po drugie, przejąłem różne metody w scenie wspomnianej powyżej w odnośniku powyżej i dodałem instrukcje drukowania pokazujące nazwę każdej wywoływanej funkcji. Następnie dodałem instrukcję drukowania do metody touchesBegan
.
Na uruchamiając aplikację, wyjście było:
update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
touchesBegan in scene
update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
update
i ten wzór został powtórzony, gdy kliknąłem.
Żadna ilość kliknięcie dał mi nic innego niż touchesBegan
miano pomiędzy didFinishUpdate
(to znaczy, że koniec jednego cyklu) i update
(początek następnego).
Wniosek: dotknięcie przetwarzania odbywa się w głównej pętli przed wywołaniem metody aktualizacji. Dlatego nie jest konieczne synchronizowanie zasobów między tymi dwiema metodami.
Nie jestem do końca pewien, ale mam 99% pewności, że będzie w głównym wątku, ponieważ zdarzenia dotykowe są odbierane przez pętlę głównego przebiegu. – NobodyNada
Myślę, że możemy teraz osiągnąć 99,9%. Dzięki za komentarz - to było wystarczająco dobre do pracy. – rghome