Main Thread Checker: API пользовательского интерфейса, вызываемый в фоновом потоке: - [UIApplication applicationState]
Я использую карты Google в Xcode 9 beta, iOS 11.
Я получаю сообщение об ошибке в журнал следующим образом:
Main Thread Checker: 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)")
}
}
Ответы
Ответ 1
Во-первых, убедитесь, что ваши вызовы карт Google и изменений пользовательского интерфейса вызываются из основного потока с помощью:
DispatchQueue.main.async {
//Do UI Code here.
//Call Google maps methods.
}
Также обновите текущую версию карт Google. Карты Google должны были сделать пару обновлений для проверки потока.
На вопрос: "Почему это происходит?" Я думаю, что Apple добавила утверждение для крайнего случая, для которого Google затем пришлось обновить свой модуль.
Ответ 2
Трудно найти код пользовательского интерфейса, который иногда не выполняется в основном потоке. Вы можете использовать трюк ниже, чтобы найти его и исправить.
- Выберите "Редактировать схему" → "Диагностика", установите флажок "Проверка основного потока" и "Приостановить" при возникновении проблем.
![enter image description here]()
-
Запустите приложение iOS, чтобы воспроизвести эту проблему. (Xcode должен остановиться на первой проблеме.) ![enter image description here]()
-
Оберните код, который изменяет пользовательский интерфейс, в DispatchQueue.main.async {}
![enter image description here]()
Ответ 3
Оберните строки кода, которые изменяют пользовательский интерфейс в DispatchQueue.main.async {}
, чтобы убедиться, что они выполняются в основном потоке. В противном случае вы можете вызывать их из фонового потока, где изменения пользовательского интерфейса не допускаются. Все такие строки кода должны выполняться из основного потока.
Ответ 4
Ссылка на эту ссылку
https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Для меня это срабатывало, когда я вызывал из блока.
Ответ 5
@unchartedworks
Я получил эту ошибку, Проверка основного потока: API пользовательского интерфейса вызван в фоновом потоке: - [UIApplication applicationState] PID: 2145, TID: 557528, Имя потока: (нет), Имя очереди: com.google.fira.worker, QoS: 9 Backtrace: 4 DownRoute 0x0000000102ca8120 FIRAIsAppActive + 56 5 DownRoute 0x0000000102ca75cc - [FIRASessionReporter shouldStartNewSession] + 24 6 DownRoute 0x0000000102ca7170 - [FIRASessionReporter initWithPersistedConfig:] + 284 7 DownRoute 0x0000000102c92e58 __48- [FIRAMeasurement startMeasurementOnWorkerQueue] _block_invoke + 1828 8 libdispatch.dylib 0x00000001048e0dc8 _dispatch_client_callout + 16 9 libdispatch.dylib 0x00000001048e2e28 _dispatch_once_callout + 84 10 DownRoute 0x0000000102c92718 - [FIRAMeasurement startMeasurementOnWorkerQueue] + 268 11 DownRoute 0x0000000102c924e4 - [FIRAMeasurement setEnabledOnWorkerQueue:] + 124 12 DownRoute 0x0000000102ca6de8 __52- [FIRAScheduler scheduleOnWorkerQueueBlockID: блок:] _ block_invoke + 44 13 libdispatch.dylib 0x00000001048df824 _dispatch_call _block_and_release + 24 14 libdispatch.dylib 0x00000001048e0dc8 _dispatch_client_callout + 16 15 libdispatch.dylib 0x00000001048e8e6c _dispatch_lane_serial_drain + 720 16 libdispatch.dylib 0x00000001048e9b60 _dispatch_lane_invoke + 460 17 libdispatch.dylib 0x00000001048f3bfc _dispatch_workloop_worker_thread + 1220 18 libsystem_pthread.dylib 0x00000001e6aad0dc _pthread_wqthread + 312 19 libsystem_pthread.dylib 0x00000001e6aafcec start_wqthread + 4
→ Я сделал то же самое, но я получил ошибку ниже, вы можете мне помочь
libMainThreadChecker.dylib '__ main_thread_checker_on_report: → 0x1032bd484 <+0>: ret
Ответ 6
Я думаю, что решение уже дано, потому что моя проблема - клавиатура в пути.
UIKeyboardTaskQueue может быть вызван только из основного потока
Ответ 7
Если вы столкнулись с этой проблемой во время выполнения тестовой цели, снимите флажок "Проверка основного потока", как на рисунке: ![enter image description here]()
Ответ 8
Выберите схему → Диагностика, удалите проверку основного потока, затем предупреждение исчезнет.
редактор схем