주 스레드 체커: 백그라운드 스레드에서 호출된 UI API: -[UIApplicationapplicationState]
저는 Xcode 9 베타, iOS 11에서 구글 맵을 사용하고 있습니다.
로그에 다음과 같은 오류가 출력됩니다.
Main Thread Checker: 백그라운드 스레드에서 호출된 UI API: -[UIApplication applicationState] PID: 4442, TID: 837820, 스레드 이름: com.google.Maps.LablingBehavior, 큐 이름: 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)")
}
}
때때로 메인 스레드에서 실행되지 않는 UI 코드를 찾기가 어렵습니다.아래의 방법을 사용하여 위치를 찾아 수정할 수 있습니다.
Edit Scheme -> Diagnostics를 선택하고 Main Thread Checker를 선택합니다.
Xcode 11.4.1
기본 스레드 체커 옆에 있는 작은 화살표를 눌러 기본 스레드 체커 중단점을 작성합니다.
이전 Xcode
이슈에 대해 일시 중지를 클릭합니다.
iOS 응용 프로그램을 실행하여 이 문제를 재현합니다.(Xcode는 첫 번째 문제에서 일시 중지되어야 합니다.)
먼저, 메인 스레드에서 Google 지도와 UI 변경사항의 호출이 호출되는지 확인합니다.
다음 단계를 사용하여 Xcode에서 스레드 Sanitizer 옵션을 활성화할 수 있습니다.
다음을 사용하여 메인 스레드에서 문제가 되는 선을 연기할 수 있습니다.
DispatchQueue.main.async {
//Do UI Code here.
//Call Google maps methods.
}
또한 현재 버전의 Google 지도를 업데이트합니다.구글 지도는 스레드 체커를 위해 몇 가지 업데이트를 해야 했습니다.
질문: "왜 이런 일이 발생합니까?"나는 애플이 엣지 케이스에 대한 주장을 추가했다고 생각합니다. 구글은 그 때 그들의 포드를 업데이트해야 했습니다.
UI를 수정하는 코드 줄을 묶습니다.DispatchQueue.main.async {}
메인 스레드에서 실행되도록 합니다.그렇지 않으면 UI 수정이 허용되지 않는 백그라운드 스레드에서 호출할 수 있습니다.이러한 모든 코드 행은 메인 스레드에서 실행되어야 합니다.
이 링크를 참조하십시오. https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
블록에서 전화를 걸었을 때 효과가 있었습니다.
해결책은 이미 제시된 것 같습니다. 제 문제는 키보드입니다.
UIKeyboard TaskQueue는 메인 스레드에서만 호출할 수 있습니다.
스킴 -> 진단을 선택하고 메인 스레드 체커를 제거하면 경고가 사라집니다.계획 편집기
언급URL : https://stackoverflow.com/questions/44767778/main-thread-checker-ui-api-called-on-a-background-thread-uiapplication-appli
'programing' 카테고리의 다른 글
Objective-C 코드가 Swift 클래스 확장을 호출할 수 있습니까? (0) | 2023.08.04 |
---|---|
웹킷은 무엇이며 CSS와 어떤 관계가 있습니까? (0) | 2023.08.04 |
'key: value'마다 한 줄씩 사용하여 CSV 파일에 사전 쓰기 (0) | 2023.08.04 |
안드로이드에서 장치의 IMEI/ESN을 프로그래밍 방식으로 가져오는 방법은 무엇입니까? (0) | 2023.08.04 |
MariaDB - 'AS'로 생성된 열의 기본값은 1024입니다. (0) | 2023.08.04 |