programing

주 스레드 체커: 백그라운드 스레드에서 호출된 UI API: -[UIApplicationapplicationState]

closeapi 2023. 8. 4. 23:05
반응형

주 스레드 체커: 백그라운드 스레드에서 호출된 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 코드를 찾기가 어렵습니다.아래의 방법을 사용하여 위치를 찾아 수정할 수 있습니다.

  1. Edit Scheme -> Diagnostics를 선택하고 Main Thread Checker를 선택합니다.

    Xcode 11.4.1

    기본 스레드 체커 옆에 있는 작은 화살표를 눌러 기본 스레드 체커 중단점을 작성합니다.

    이전 Xcode

    이슈에 대해 일시 중지를 클릭합니다.

  2. iOS 응용 프로그램을 실행하여 이 문제를 재현합니다.(Xcode는 첫 번째 문제에서 일시 중지되어야 합니다.)

  3. UI를 수정하는 코드를 래핑합니다.DispatchQueue.main.async {} enter image description here

먼저, 메인 스레드에서 Google 지도와 UI 변경사항의 호출이 호출되는지 확인합니다.

다음 단계를 사용하여 Xcode에서 스레드 Sanitizer 옵션을 활성화할 수 있습니다.

Screenshot

다음을 사용하여 메인 스레드에서 문제가 되는 선을 연기할 수 있습니다.

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

반응형