Estou usando o google maps no Xcode 9 beta, iOS 11.
Estou recebendo um erro no log da seguinte maneira:
Verificador de thread principal: UI API chamada em um thread de segundo plano: - [UIApplication applicationState] PID: 4442, TID: 837820, Nome do thread: com.google.Maps.LabelingBehavior, Nome da fila: com.apple.root.default-qos.overcommit , QoS: 21
Por que isso estaria ocorrendo, já que tenho quase certeza de que não estou alterando nenhum elemento de interface do thread principal em meu 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
MattBlack
fonte
fonte
mapView(_:didChange)
você está despachando asprint
instruções para a fila principal. Você ainda não está na fila principal? Do contrário, você também deve enviar aanimate
chamada para a fila principal. Eu sugiro inserir algunsdispatchPrecondition(condition: .onQueue(.main))
antes dessas atualizações da IU, apenas para ter certeza.Respostas:
Primeiro, certifique-se de que suas invocações de mapas do Google e mudanças de interface do usuário sejam chamadas a partir do tópico principal.
Você pode habilitar o Thread Sanitizer para localizar linhas problemáticas.
Você pode colocar linhas ofensivas no tópico principal com o seguinte:
Além disso, atualize sua versão atual do google maps. O Google Maps teve que fazer algumas atualizações para o verificador de threads.
Para a pergunta: "Por que isso estaria ocorrendo?" Acho que a Apple acrescentou uma afirmação para um caso extremo para o qual o Google teve que atualizar seu pod.
fonte
É difícil encontrar o código da IU que às vezes não é executado no thread principal. Você pode usar o truque abaixo para localizá-lo e corrigi-lo.
Escolha Editar esquema -> Diagnóstico, marque Verificador de thread principal.
Xcode 11.4.1
Clique na pequena seta ao lado do Main Thread Checker para criar um ponto de interrupção do Main Thread Checker.
Xcode anterior
Marque em Pausa nos problemas.
Execute seu aplicativo iOS para reproduzir este problema. (O Xcode deve pausar na primeira edição.)
Envolva o código que modifica a IU em
DispatchQueue.main.async {}
fonte
"com.apple.CoreMotion.MotionThread(23)"
, então eu verifico todos os outros tópicos também. EmThread 1
algo me chamou a atenção: é SVProgressHUD (uma biblioteca de vista o progresso que eu usei). Então, eu sei que é uma chamada paraSVProgressHUD.show()
algum lugar no controlador de exibição de destino. Em seguida, envolva cada aparência comDispatchQueue.main.async
ou simplesmente comente, teste novamente e descobri qual é o problema.Envolva as linhas de código que modificam a IU
DispatchQueue.main.async {}
para garantir que sejam executadas no thread principal. Caso contrário, você pode chamá-los de um thread de segundo plano, onde modificações de IU não são permitidas. Todas essas linhas de código devem ser executadas a partir do thread principal.fonte
DispatchQueue.main.async {}
Consulte este link https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Para mim, isso funcionou quando liguei do bloco.
fonte
Acho que a solução já está dada, Pois meu problema é o teclado a caminho.
UIKeyboardTaskQueue só pode ser chamado a partir do thread principal
fonte
Escolha o esquema -> Diagnótico, remova o verificador da linha de execução principal e o aviso desaparecerá. editor de esquema
fonte