Estoy usando mapas de Google en Xcode 9 beta, iOS 11.
Recibo un error en el registro de la siguiente manera:
Comprobador de subprocesos principal: API de interfaz de usuario llamada en un subproceso en segundo plano: - [UIApplication applicationState] PID: 4442, TID: 837820, Nombre del subproceso: com.google.Maps.LabelingBehavior, Nombre de la cola: com.apple.root.default-qos.overcommit , QoS: 21
¿Por qué ocurriría esto? Estoy casi seguro de que no estoy alterando ningún elemento de la interfaz del hilo principal en mi código.
override func viewDidLoad() {
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
viewMap.delegate = self
let camera = GMSCameraPosition.camera(withLatitude: 53.7931183329367, longitude: -1.53649874031544, zoom: 17.0)
viewMap.animate(to: camera)
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
}
func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
if(moving > 1){
moving = 1
UIView.animate(withDuration: 0.5, delay: 0, animations: {
self.topBarConstraint.constant = self.topBarConstraint.constant + (self.topBar.bounds.height / 2)
self.bottomHalfConstraint.constant = self.bottomHalfConstraint.constant + (self.topBar.bounds.height / 2)
self.view.layoutIfNeeded()
}, completion: nil)
}
moving = 1
}
// Camera change Position this methods will call every time
func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
moving = moving + 1
if(moving == 2){
UIView.animate(withDuration: 0.5, delay: 0, animations: {
self.topBarConstraint.constant = self.topBarConstraint.constant - (self.topBar.bounds.height / 2)
self.bottomHalfConstraint.constant = self.bottomHalfConstraint.constant - (self.topBar.bounds.height / 2)
self.view.layoutIfNeeded()
}, completion: nil)
}
DispatchQueue.main.async {
print("Moving: \(moving) Latitude: \(self.viewMap.camera.target.latitude)")
print("Moving: \(moving) Longitude: \(self.viewMap.camera.target.longitude)")
}
}
swift
google-maps
xcode9-beta
Negro mate
fuente
fuente
mapView(_:didChange)
, está enviando lasprint
declaraciones a la cola principal. ¿No estás ya en la cola principal? De lo contrario, también debe enviar laanimate
llamada a la cola principal. Sugeriría insertar algunosdispatchPrecondition(condition: .onQueue(.main))
antes de esas actualizaciones de la interfaz de usuario, solo para asegurarse.Respuestas:
Primero, asegúrese de que sus invocaciones de mapas de Google y cambios de interfaz de usuario se llamen desde el hilo principal.
Puede habilitar Thread Sanitizer para encontrar líneas ofensivas.
Puede poner líneas ofensivas en el hilo principal con lo siguiente:
Además, actualice su versión actual de Google Maps. Los mapas de Google tuvieron que hacer un par de actualizaciones para el verificador de hilos.
Para la pregunta: "¿Por qué estaría ocurriendo esto?" Creo que Apple agregó una afirmación para un caso límite para el que Google tuvo que actualizar su pod.
fuente
Es difícil encontrar el código de la interfaz de usuario que a veces no se ejecuta en el hilo principal. Puede usar el siguiente truco para localizarlo y solucionarlo.
Elija Editar esquema -> Diagnóstico, marque Comprobador de hilo principal.
Xcode 11.4.1
Haga clic en la flecha pequeña junto al Comprobador de hilo principal para crear un punto de interrupción del Comprobador de hilo principal.
Xcode anterior
Marque la casilla Pausa en los problemas.
Ejecute su aplicación iOS para reproducir este problema. (Xcode debería detenerse en el primer problema).
Envuelva el código que modifica la interfaz de usuario en
DispatchQueue.main.async {}
fuente
"com.apple.CoreMotion.MotionThread(23)"
, luego reviso todos los demás hilos también. EnThread 1
algo me llamó la atención: es SVProgressHUD (una biblioteca de vista de progreso que usé). Entonces, sé que es una llamada aSVProgressHUD.show()
algún lugar del controlador de vista de destino. Luego, envuelva cada aparienciaDispatchQueue.main.async
o simplemente comente, pruebe nuevamente y descubrí cuál es problemática.Envuelva las líneas de código que modifican la interfaz de usuario
DispatchQueue.main.async {}
para asegurarse de que se ejecutan en el hilo principal. De lo contrario, es posible que los esté llamando desde un hilo en segundo plano, donde no se permiten modificaciones de la interfaz de usuario. Todas estas líneas de código deben ejecutarse desde el hilo principal.fuente
DispatchQueue.main.async {}
Consulte este enlace https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Para mí, esto funcionó cuando llamé desde el bloque.
fuente
Creo que la solución ya está dada, porque mi problema es el teclado en camino.
UIKeyboardTaskQueue solo se puede llamar desde el hilo principal
fuente
Elija esquema -> Diagnóstico, elimine el verificador de hilo principal, luego la advertencia desaparecerá. editor de esquemas
fuente