Я использую карты 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)")
}
}
swift
google-maps
xcode9-beta
Матовый черный
источник
источник
mapView(_:didChange)
вы диспетчеризациюprint
заявления в основную очередь. Вы еще не в основной очереди? Если нет, вам также необходимо отправитьanimate
вызов в основную очередь. Я бы посоветовал вставить несколькоdispatchPrecondition(condition: .onQueue(.main))
перед этими обновлениями пользовательского интерфейса, на всякий случай.Ответы:
Во-первых, убедитесь, что ваши вызовы карт Google и изменения пользовательского интерфейса вызываются из основного потока.
Вы можете включить дезинфицирующее средство потока, чтобы найти проблемные строки.
Вы можете поместить оскорбительные строки в основной поток следующим образом:
Кроме того, обновите текущую версию карт Google. Карты Google пришлось сделать пару обновлений для средства проверки потоков.
На вопрос: «Почему это происходит?» Я думаю, что Apple добавила утверждение для крайнего случая, для которого Google затем пришлось обновить свой модуль.
источник
Иногда сложно найти код пользовательского интерфейса, который не выполняется в основном потоке. Вы можете использовать описанный ниже трюк, чтобы найти и исправить.
Выберите Edit Scheme -> Diagnostics, отметьте Main Thread Checker.
Xcode 11.4.1
Щелкните маленькую стрелку рядом со средством проверки основного потока, чтобы создать точку останова средства проверки основного потока.
Предыдущий Xcode
Отметьте «Пауза» по вопросам
Запустите приложение iOS, чтобы воспроизвести эту проблему. (Xcode должен остановиться на первой проблеме.)
Оберните код, изменяющий пользовательский интерфейс, в
DispatchQueue.main.async {}
источник
"com.apple.CoreMotion.MotionThread(23)"
, затем я также проверяю все другие потоки. Что-Thread 1
то привлекло мое внимание: это SVProgressHUD (библиотека просмотра прогресса, которую я использовал). Итак, я знаю, что это вызовSVProgressHUD.show()
где-то в целевом контроллере представления. Затем либо оберните каждое появление,DispatchQueue.main.async
либо просто закомментируйте, проверьте еще раз, и я выяснил, какой из них проблематичный.Оберните строки кода, которые изменяют пользовательский интерфейс
DispatchQueue.main.async {}
, чтобы обеспечить их выполнение в основном потоке. В противном случае вы можете вызывать их из фонового потока, в котором модификации пользовательского интерфейса не разрешены. Все такие строки кода должны выполняться из основного потока.источник
DispatchQueue.main.async {}
Перейдите по этой ссылке https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Для меня это сработало, когда я позвонил из блока.
источник
Я думаю, что решение уже дано, потому что моя проблема - клавиатура в пути.
UIKeyboardTaskQueue можно вызывать только из основного потока
источник
Выберите схему -> Диагностика, удалите средство проверки основного потока, после чего предупреждение исчезнет. редактор схем
источник