Проверка основного потока: UI API вызывается в фоновом потоке: - [UIApplication applicationState]
Я использую Google maps в Xcode 9 beta, iOS 11.
Я получаю сообщение об ошибке, выводимое в журнал следующим образом:
Main Thread Checker: UI API вызывается в фоновом потоке: - [UIApplication applicationState] PID: 4442, TID: 837820, название потока: com.гуглить.Карты.LabelingBehavior, имя очереди: com.яблоко.корень.по умолчанию-qos.так, например, функция 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)")
}
}
6 ответов
мой ответ предполагает, что вы уже проверили, чтобы убедиться, что ваши коды не изменяя пользовательского интерфейса из фонового потока.
Xcode 9, 10.29.17
- обновите свои стручки. Многие разработчики Cocoapod догоняют позднюю проверку потоков.
- если разработчик cocoa pod не обновляет свой стручок, вы можете попробовать связаться с ними или предложить изменения.
Xcode 9 бета
Я заметил недавно встроенный сбой во время выполнения с Xcode 9 beta, которого нет с xcode 8. Это означает, что если включить проверку потоков, сбой присутствует, если отключить проверку потоков, сбой отсутствует. Если вы не хотите, чтобы ваша программа рухнула, вы можете вернуться к xcode 8 или отключить проверку потоков, пока Apple не удалит новый сбой или ваши стручки больше не вызовут его.
попытка обернуть все строки кода, которые изменяют пользовательский интерфейс в DispatchQueue.main.async {}
строительство.
трудно найти код пользовательского интерфейса, который иногда не выполняется в основном потоке. Вы можете использовать трюк ниже, чтобы найти и исправить ее.
смотрите по этой ссылке https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
для меня это сработало, когда я позвонил из блока.
выберите scheme - > Diagnotics, удалите main thread checker, затем предупреждение исчезнет. редактор схемы