主线程检查器: 在后台线程上调用的 UI API:-[ UIApplicationapplicationState ]

我在 Xcode 9 beta,iOS 11中使用谷歌地图。

我得到一个错误输出到日志如下:

主线程检查器: 在后台线程上调用的 UI API:-[ UIApplicationapplicationState ] PID: 4442,TID: 837820,Thread name: com.google. Maps. LabelingBehavior,Queue name: com.apple.root.default-QoS. overcommit,QoS: 21

为什么会发生这种情况,因为我几乎可以肯定我没有改变代码中主线程的任何接口元素。

 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)")
}
}
106404 次浏览

DispatchQueue.main.async {}中包装修改 UI 的代码行,以确保它们在主线程上执行。否则,您可能会从不允许修改 UI 的后台线程调用它们。所有这些代码行都必须从主线程执行。

选择 scheme-> Diagnotics,删除主线程检查器,然后警告将消失。 计划编辑

首先,确保从主线程调用谷歌地图和 ui 更改。

你可以使用以下步骤在 Xcode 启用 线程消毒剂选项:

Screenshot

你可以用下面的方法在主线上加上不恰当的句子:

DispatchQueue.main.async {
//Do UI Code here.
//Call Google maps methods.
}

此外,更新你当前版本的谷歌地图。Google 地图不得不为线程检查器做了一些更新。

问题是: “为什么会发生这种情况?”我认为苹果增加了一个 断言的边缘情况下,谷歌然后不得不更新他们的吊舱。

请参考此链接 Https://developer.apple.com/documentation/code_diagnostics/main_thread_checker

对我来说,这工作时,我从街区打电话。

有时很难找到不在主线程中执行的 UI 代码。您可以使用下面的技巧来定位和修复它。

  1. 选择编辑方案-> 诊断,勾选主线程检查器。

    Xcode 11.4.1

    单击 Main Thread Checker 旁边的小箭头以创建 Main Thread Checker 断点。 enter image description here

    上一个 Xcode

    点击暂停处理问题。 enter image description here

  2. 运行您的 iOS 应用程序来重现这个问题(Xcode 应该在第一个问题上暂停) enter image description here

  3. DispatchQueue.main.async {}中包装修改 UI 的代码 enter image description here

我认为解决办法已经给出, 因为我的问题是键盘在路上。

UIKeyboardTaskQueue 只能从主线程 调用