Проверка основного потока: API пользовательского интерфейса вызывается в фоновом потоке: -[UIApplication applicationState]
Я использую карты Google в бета-версии Xcode 9, iOS 11.
Я получаю сообщение об ошибке в журнал:
Проверка основного потока: API пользовательского интерфейса вызывается в фоновом потоке: -[UIApplication applicationState] PID: 4442, TID: 837820, имя потока: com.google.Maps.LabelingBehavior, имя очереди: 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)")
}
}
6 ответов
Мой ответ предполагает, что вы уже проверили, чтобы убедиться, что ваши коды не изменяют пользовательский интерфейс из фонового потока.
Xcode 9, 10.29.17
- Обновите ваши стручки. Многие разработчики Cocoapod догоняют систему проверки поздних потоков.
- Если разработчик какао-бобов не обновляет их, то вы можете попробовать связаться с ними или предложить изменения.
Xcode 9 beta
Я заметил недавно встроенный сбой во время выполнения с бета-версией xcode 9, которого нет с xcode 8. Это означает, что если вы включаете проверку потока, то сбой присутствует, если вы отключаете проверку потока, сбоя нет. Если вы не хотите, чтобы ваша программа вызывала сбой, вы можете вернуться к xcode 8 или отключить проверку потоков, пока Apple не удалит новый сбой, или ваши модули больше не будут вызывать его.
Трудно найти код пользовательского интерфейса, который иногда не выполняется в основном потоке. Вы можете использовать трюк ниже, чтобы найти его и исправить.
- Выберите "Редактировать схему" -> "Диагностика", установите флажок "Проверка основного потока" и "Приостановить" при возникновении проблем.
Запустите приложение iOS, чтобы воспроизвести эту проблему. (Xcode должен остановиться на первой проблеме.)
Оберните код, который изменяет пользовательский интерфейс в
DispatchQueue.main.async {}
Попытка обернуть все строки кода, которые изменяют пользовательский интерфейс в DispatchQueue.main.async {}
работает.
Перейдите по этой ссылке https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Для меня это сработало, когда я позвонил из блока.
Я думаю, что решение уже дано, потому что моя проблема - клавиатура в пути.
UIKeyboardTaskQueue можно вызывать только из основного потока
Выберите схему -> Диагностика, удалите проверку основного потока, тогда предупреждение исчезнет. редактор схем