TL; DR:
Todas las manipulaciones de la interfaz de usuario deben realizarse en el hilo principal para evitar problemas. Si no lo hizo, Main Thread Checker (función de depuración recién introducida en XCode 9) producirá problemas en tiempo de ejecución. Así que envuelva su código en el bloque Main Thread como se muestra a continuación para evitar fallas y advertencias de tiempo de ejecución.
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
En versiones de Xcode anteriores a la ver. 9, las advertencias relacionadas con el hilo principal se imprimirían textualmente en el área de la consola. De todos modos, puede deshabilitar opcionalmente ( no es un enfoque recomendado ) el Comprobador de subprocesos principal en la configuración de diagnóstico en Editar esquema .
Explicación:
Apple introdujo una nueva opción de depuración en XCode 9 para verificar problemas en Runtime para UIKit y otras API que manipulan elementos de UI. Si hay algún cambio en los elementos de la interfaz de usuario de la API de UIKit en tiempo de ejecución, sin un bloque de hilo principal, es muy probable que cause fallas y fallas en la interfaz de usuario. El Comprobador de subprocesos principal está habilitado de forma predeterminada para detectar esos problemas en tiempo de ejecución. Puede deshabilitar el Comprobador de subprocesos principal en la ventana Editar esquema como se muestra a continuación, aunque realmente no se recomienda hacerlo:
Si tiene algún SDK o Frameworks más antiguo, al actualizar a Xcode 9, puede enfrentar esta advertencia ya que algunas de las llamadas al método UIKit no se habrían envuelto en Main Thread. Actualizarlos a la última versión solucionaría el problema (si el desarrollador lo sabe y lo soluciona).
Cita de las notas de la versión beta de XCode 9:
- Nuevo en Xcode 9 - Main Thread Checker.
- Habilitar la detección del uso indebido de la API de la interfaz de usuario desde el hilo en segundo plano
- Detecta llamadas a métodos AppKit, UIKit y WebKit que no se realizan en el hilo principal.
- Se habilita automáticamente durante la depuración y se puede deshabilitar en la pestaña Diagnóstico del editor de esquemas.
- Main Thread Checker funciona con los lenguajes Swift y C.
UIApplication.shared.registerForRemoteNotifications()
en el hilo principal. :) Vamos a google cómo llamarlo en el hilo principal ...