web-dev-qa-db-ja.com

メインスレッドチェッカー:バックグラウンドスレッドで呼び出されたUI API: - [UIApplication applicationState]

Xcode 9ベータ版、iOS 11でGoogleマップを使用しています。

次のようにログにエラーが出力されています。

メインスレッドチェッカー:バックグラウンドスレッドで呼び出されたUI 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)")
        }
    }
77
MattBlack

まず、グーグルマップの呼び出しとUIの変更がメインスレッドから呼び出されていることを確認します。

DispatchQueue.main.async {
    //Do UI Code here. 
    //Call Google maps methods.
}

また、Googleマップの現在のバージョンを更新してください。グーグルマップはスレッドチェッカーのために2、3の更新をしなければならなかった。

「なぜこれが起こるのだろうか」という質問に対して。私はAppleがEdgeの訴訟についての主張を追加したと思う。Googleはそれからポッドを更新しなければならなかった。

5
ScottyBlades

メインスレッドで実行されないことがあるUIコードを見つけるのは難しいです。あなたはそれを見つけてそれを修正するために以下のトリックを使うことができます。

  1. [スキームの編集] - > [診断]を選択し、[メインスレッドチェッカー]を選択して[問題を一時停止] enter image description here
  2. IOSアプリケーションを実行してこの問題を再現してください。 (Xcodeは最初の号で一時停止するはずです。) enter image description here

  3. UIを変更するコードをDispatchQueue.main.async {}にラップします。enter image description here

99
UnchartedWorks

DispatchQueue.main.async {}でUIを変更するすべてのコード行をラップしようとするとうまくいきます。

45

このリンクを参照してください https://developer.Apple.com/documentation/code_diagnostics/main_thread_checker

私にとっては、ブロックから呼び出したときにこれがうまくいきました。

解決策はすでに与えられていると思います。私の問題はキーボードが近づいているからです。

IKeyboardTaskQueueはメインスレッドからのみ呼び出すことができます

0
gamal