8

Co to jest właściwy sposób? Dokumentacja NSTimer mówi tak:Czy bezpieczne jest planowanie i unieważnianie NSTimerów w kolejce szeregowej GCD?

Rozważania specjalne

Musisz wysłać tę wiadomość z wątku na który został zainstalowany zegar. Jeśli wyślesz tę wiadomość z innego wątku , źródło wejściowe skojarzone z zegarem nie może zostać usunięte z pętli uruchamiania, , co może uniemożliwić prawidłowe opuszczenie wątku przez .

Od GCD nie zapewniam was, że seryjny kolejka będzie zawsze uruchamiane bloki w tym samym wątku, co jest właściwym sposobem, aby zaplanować i unieważnia się NSTimer w tym samym wątku?

EDIT:

Po Radzi poniższa odpowiedź, stworzyłem MSWeakTimer (https://github.com/mindsnacks/MSWeakTimer), który jest wdrożenie niestandardowych zegar używając GCD który może być używany z dowolnym kolejce.

+0

+1 dla MSWeakTimer ... Rozwiązał nasze straszne problemy z pamięcią! – jowie

Odpowiedz

9

Nie należy instalować NSTimer w anonimowym wątku roboczym zarządzanym przez GCD.

Zastosowanie wysyłki źródła timera z GCD zamiast NSTimer, por dispatch_source_create (3).

NSTimer polega na runloop bieżącego wątku, który nie jest coś, co ma sens dla kolejki GCD. Zobacz sesję GCD WWDC2012, aby uzyskać więcej szczegółowych informacji na temat GCD i interfejsów API runloop.

+0

To ma wiele sensu. Domyślam się, że jedynym wyjątkiem byłaby główna kolejka, mam rację? –

+0

poprawne, o ile proces nie wywołuje dispatch_main (3), główny runloop i główna kolejka są powiązane i gwarantowane do wykonania w głównym wątku. – das

+1

https://github.com/mindsnacks/MSWeakTimer –

Powiązane problemy