TL; DR:
Wszystkie manipulacje interfejsem użytkownika należy wykonywać w głównym wątku, aby uniknąć problemów. Jeśli tego nie zrobi, Main Thread Checker (nowo wprowadzona funkcja debugowania w XCode 9) spowoduje problemy w czasie wykonywania. Więc zawiń swój kod w bloku głównego wątku, jak poniżej, aby uniknąć usterek i ostrzeżeń w czasie wykonywania.
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
W wydaniach Xcode przed wer. 9, ostrzeżenia związane z głównym wątkiem byłyby drukowane w obszarze konsoli tekstowo. W każdym razie możesz opcjonalnie wyłączyć ( nie jest to zalecane podejście ) Kontroler głównego wątku w ustawieniach diagnostycznych w Edytuj schemat .
Wyjaśnienie:
Firma Apple wprowadziła nową opcję debugowania w XCode 9 do sprawdzania problemów w czasie wykonywania dla UIKit i innych interfejsów API, które manipulują elementami interfejsu użytkownika. Jeśli wystąpią jakiekolwiek zmiany w elementach interfejsu użytkownika z interfejsu API UIKit w czasie wykonywania, bez bloku wątku głównego, jest wysoce prawdopodobne, że spowoduje to usterki interfejsu użytkownika i awarie. Narzędzie do sprawdzania wątków głównych jest domyślnie włączone, aby wychwytywać te problemy w czasie wykonywania. Możesz wyłączyć Kontroler wątków głównych w oknie Edytuj schemat, tak jak poniżej, chociaż nie jest to zalecane:
Jeśli masz jakieś starsze SDK lub frameworki, podczas aktualizacji do Xcode 9 możesz napotkać to ostrzeżenie, ponieważ niektóre wywołania metod UIKit nie zostałyby opakowane w główny wątek. Zaktualizowanie ich do najnowszej wersji rozwiązałoby problem (jeśli programista jest tego świadomy i naprawił go).
Cytat z informacji o wersji beta XCode 9:
- Nowość w Xcode 9 - Main Thread Checker.
- Włącz wykrywanie niewłaściwego użycia interfejsu API interfejsu użytkownika w wątku w tle
- Wykrywa wywołania metod AppKit, UIKit i WebKit, które nie są wykonywane w głównym wątku.
- Automatycznie włączane podczas debugowania i można je wyłączyć na karcie Diagnostyka w edytorze schematów.
- Main Thread Checker działa z językami Swift i C.
UIApplication.shared.registerForRemoteNotifications()
w głównym wątku. :) Google jak to nazwać w głównym wątku ...