Ich verwende Google Maps in Xcode 9 Beta, iOS 11.
Ich erhalte folgende Fehlermeldung im Protokoll:
Haupt-Thread-Checker: UI-API, die für einen Hintergrund-Thread aufgerufen wird: - [UIApplication applicationState] PID: 4442, TID: 837820, Thread-Name: com.google.Maps.LabelingBehavior, Warteschlangenname: com.apple.root.default-qos.overcommit , QoS: 21
Warum sollte dies passieren, da ich fast sicher bin, dass ich keine Schnittstellenelemente aus dem Hauptthread in meinem Code ändere?
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
Mattschwarz
quelle
quelle
mapView(_:didChange)
senden Sie dieprint
Anweisungen an die Hauptwarteschlange. Stehen Sie noch nicht in der Hauptwarteschlange? Wenn nicht, müssen Sie denanimate
Anruf auch an die Hauptwarteschlange weiterleiten. Ich würde vorschlagen,dispatchPrecondition(condition: .onQueue(.main))
vor diesen UI-Updates einige einzufügen, nur um sicherzugehen.Antworten:
Stellen Sie zunächst sicher, dass Ihre Aufrufe von Google Maps und UI-Änderungen vom Haupt-Thread aufgerufen werden.
Sie können den Thread Sanitizer aktivieren , um fehlerhafte Linien zu finden.
Sie können den Haupt-Thread mit den folgenden Zeilen beleidigen:
Aktualisieren Sie außerdem Ihre aktuelle Version von Google Maps. Google Maps musste einige Aktualisierungen für den Thread-Checker vornehmen.
Für die Frage: "Warum sollte das passieren?" Ich denke, Apple hat eine Behauptung für einen Randfall hinzugefügt , für den Google dann seinen Pod aktualisieren musste.
quelle
Es ist schwierig, den UI-Code zu finden, der manchmal nicht im Hauptthread ausgeführt wird. Sie können den folgenden Trick verwenden, um es zu finden und zu beheben.
Wählen Sie Schema bearbeiten -> Diagnose und aktivieren Sie das Kontrollkästchen Haupt-Thread-Checker.
Xcode 11.4.1
Klicken Sie auf den kleinen Pfeil neben dem Haupt-Thread-Checker, um einen Haltepunkt für den Haupt-Thread-Checker zu erstellen.
Vorheriger Xcode
Aktivieren Sie Pause bei Problemen.
Führen Sie Ihre iOS-Anwendung aus, um dieses Problem zu reproduzieren. (Xcode sollte bei der ersten Ausgabe pausieren.)
Wickeln Sie den Code ein, der die Benutzeroberfläche ändert
DispatchQueue.main.async {}
quelle
"com.apple.CoreMotion.MotionThread(23)"
, dann überprüfe ich auch alle anderen Threads. InThread 1
etwas fiel mir auf: Es ist SVProgressHUD (eine von mir verwendete Fortschrittsanzeige-Bibliothek). Ich weiß also, dass es sich um einen Aufruf an einenSVProgressHUD.show()
beliebigen Ort im Target View Controller handelt. Dann entweder jeden Auftritt einwickelnDispatchQueue.main.async
oder einfach auskommentieren, erneut testen und ich fand heraus, welcher problematisch ist.Schließen Sie die Codezeilen ein, die die Benutzeroberfläche ändern
DispatchQueue.main.async {}
, um sicherzustellen, dass sie im Hauptthread ausgeführt werden. Andernfalls rufen Sie sie möglicherweise von einem Hintergrund-Thread aus auf, in dem Änderungen an der Benutzeroberfläche nicht zulässig sind. Alle diese Codezeilen müssen vom Hauptthread ausgeführt werden.quelle
DispatchQueue.main.async {}
Verweisen Sie auf diesen Link https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Bei mir hat das geklappt, als ich aus dem Block angerufen habe.
quelle
Ich denke, die Lösung ist bereits gegeben, denn mein Problem ist Tastatur auf dem Weg.
UIKeyboardTaskQueue kann nur vom Hauptthread aufgerufen werden
quelle
Wählen Sie Schema -> Diagnose, entfernen Sie den Haupt-Thread-Prüfer, dann verschwindet die Warnung. Schema-Editor
quelle