Saya menggunakan peta google di Xcode 9 beta, iOS 11.
Saya mendapatkan kesalahan yang dikeluarkan ke log sebagai berikut:
Pemeriksa Utas Utama: API UI memanggil utas latar belakang: - [UIApplication applicationState] PID: 4442, TID: 837820, Nama utas: com.google.Maps.LabelingBehavior, Nama antrean: com.apple.root.default-qos.overcommit , QoS: 21
Mengapa ini terjadi karena saya hampir yakin saya tidak mengubah elemen antarmuka apa pun dari utas utama dalam kode saya.
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
MattBlack
sumber
sumber
mapView(_:didChange)
Anda mengirimkanprint
pernyataan ke antrian utama. Apakah Anda belum berada di antrian utama? Jika tidak, Anda juga harus mengirimkananimate
panggilan ke antrean utama. Saya sarankan untuk memasukkan beberapadispatchPrecondition(condition: .onQueue(.main))
sebelum pembaruan UI tersebut, hanya untuk memastikan.Jawaban:
Pertama, pastikan pemanggilan Google Maps dan perubahan UI Anda dipanggil dari utas utama.
Anda dapat mengaktifkan Pembersih Benang untuk menemukan garis yang menyinggung.
Anda dapat meletakkan garis menyinggung di utas utama dengan yang berikut:
Juga, perbarui versi peta google Anda saat ini. Peta Google harus membuat beberapa pembaruan untuk pemeriksa utas.
Untuk pertanyaan: "Mengapa ini terjadi?" Saya pikir Apple menambahkan pernyataan untuk kasus tepi yang kemudian harus diperbarui oleh Google untuk pod mereka.
sumber
Sulit untuk menemukan kode UI yang terkadang tidak dieksekusi di utas utama. Anda dapat menggunakan trik di bawah ini untuk menemukan dan memperbaikinya.
Pilih Edit Scheme -> Diagnostics, centang Main Thread Checker.
Xcode 11.4.1
Klik tanda panah kecil di sebelah Main Thread Checker untuk membuat titik putus Main Thread Checker.
Xcode sebelumnya
Centang pada Pause on issues.
Jalankan aplikasi iOS Anda untuk mereproduksi masalah ini. (Xcode harus berhenti pada masalah pertama.)
Gabungkan kode yang mengubah UI
DispatchQueue.main.async {}
sumber
"com.apple.CoreMotion.MotionThread(23)"
, lalu saya periksa semua utas lainnya juga. DalamThread 1
sesuatu yang menarik perhatian saya: itu adalah SVProgressHUD (perpustakaan tampilan kemajuan yang saya gunakan). Jadi, saya tahu ini adalah panggilan keSVProgressHUD.show()
suatu tempat di pengontrol tampilan target. Kemudian bungkus setiap penampilan denganDispatchQueue.main.async
atau cukup beri komentar, uji lagi dan saya menemukan mana yang bermasalah.Gabungkan baris kode yang mengubah UI
DispatchQueue.main.async {}
untuk memastikannya dijalankan di utas utama. Jika tidak, Anda mungkin memanggil mereka dari thread latar belakang, yang tidak mengizinkan modifikasi UI. Semua baris kode tersebut harus dijalankan dari utas utama.sumber
DispatchQueue.main.async {}
Lihat tautan ini https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
Bagi saya ini berhasil ketika saya menelepon dari blok.
sumber
Saya pikir solusinya sudah diberikan, Untuk masalah saya adalah Keyboard dalam perjalanan.
UIKeyboardTaskQueue hanya dapat dipanggil dari utas utama
sumber
Pilih skema -> Diagnosis, hapus pemeriksa utas utama, maka peringatan akan hilang. editor skema
sumber