Ana İş Parçacığı Denetleyicisi: Arka plan iş parçacığında çağrılan UI API'si: - [UIApplication applicationState]


107

Google haritalarını Xcode 9 beta, iOS 11 kullanıyorum.

Günlüğe aşağıdaki gibi bir hata çıktısı alıyorum:

Ana İş Parçacığı Denetleyicisi: Arka planda çağrılan UI API: - [UIApplication applicationState] PID: 4442, TID: 837820, İş parçacığı adı: com.google.Maps.LabelingBehavior, Sıra adı: com.apple.root.default-qos.overcommit , QoS: 21

Kodumdaki ana iş parçacığından herhangi bir arabirim öğesini değiştirmediğimden neredeyse emin olduğum için bu neden oluyor?

 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)")
        }
    }

1
Gelen mapView(_:didChange)sen sevk edilmektedir printana kuyruğuna ifadeleri. Zaten ana sırada değil misiniz? Değilse, animatearamayı ana kuyruğa da göndermeniz gerekir. dispatchPrecondition(condition: .onQueue(.main))Emin olmak için bu UI güncellemelerinden önce birkaç tane eklemenizi öneririm .
Rob

"Kodumdaki ana iş parçacığından herhangi bir arayüz öğesini değiştirmediğimden neredeyse eminim" dediniz. Sanırım "... herhangi bir arka plandan" demek istediniz.
Rob

2
Senin sorunun değil. Ben onların sonunda olduğunu düşünüyorum. "Com.google.Maps.LabelingBehavior" içinde durur. Ben de aynı soruna sahibim.
Tarvo Mäesepp

2
Merhaba, evet öyle, sorun google'da yatıyor gibi görünüyor, umarım yakında güncellenmiş bir sürüm
yayınlarlar

1
@MattBlack Şu yanıta bir göz atın: stackoverflow.com/a/44392584/5912335
badhanganesh

Yanıtlar:


54

Öncelikle, google haritalar ve kullanıcı arabirimi değişiklikleri çağrılarınızın ana ileti dizisinden çağrıldığından emin olun.

Sorunlu çizgileri bulmak için Thread Sanitizer'ı etkinleştirebilirsiniz .

Aşağıdakilerle ana ileti dizisine rahatsız edici satırlar koyabilirsiniz:

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

Ayrıca, google haritalarınızın mevcut sürümünü güncelleyin. Google haritalarının iş parçacığı denetleyicisi için birkaç güncelleme yapması gerekiyordu.

Soru için: "Bu neden oluyor?" Sanırım Apple , Google'ın daha sonra kapsüllerini güncellemesi gereken bir uç durum için bir iddia ekledi .


1
@thibautnoah, bunu "Google API ile birlikte xcode 9 beta kullandığınız için (sorun) oluşuyor" diye ifade etmediğim için mi söylüyorsunuz? Ya da cevabımla çözülmeyen benzer bir hatayla karşılaştığınız için mi?
ScottyBlades

7
Xcode 9, xcode 8'in görünüşte algılamadığı bazı iş parçacığı sorunlarını vurguladı (bunun xcode ayarlarından mı yoksa başka bir şeyden mi kaynaklandığının belirlenecek olması). Xcode 8'e geri dönmek, iş parçacığı sorunlarını görmezden gelmekle eşdeğerdir, bunlar hala oradalar ve çözülmediler, bu yüzden bir çözüm değil, sadece kafanızı kuma gömüyorsunuz ve her şey yolundaymış gibi yapıyorsunuz. Sorun bir çerçeveden geliyorsa düzeltilebilmesi için lütfen bir sorun gönderin.
thibaut noah

Xcode 9, xcode 8'in algılamakla orantılı olmadığı iş parçacığı sorunlarını algılar VE Xcode 9, Google'ın API'siyle birlikte bu hataya neden olabilir. Bu hata, birden çok çökme için hata ayıklayıcıda yer alır ve xcode 8'e geri döndüğünüzde artık çökmeler olmaz.
ScottyBlades

Demek istediğin nokta, iplik denetleyicinin nedeni değil belirtiyi göstermesidir. Xcode 9 beta'nın hem nedeni hem de semptom iletişimcisi olduğunu söylüyorum. "xcode 8'e geri döndüğünüzde artık çökmeler meydana gelmiyor". XCode uyarıları ile hata ayıklayıcı okumaları olan gerçek çökmeler arasında bir fark vardır. Bu hata bir uyarı VEYA bir çökme olarak görünebilir. Kilitlenme, xcode 8'e geri dönüldüğünde tamamen ortadan kalkar. Xcode 9 beta, iyi bir nedenle beta olarak adlandırılır.
ScottyBlades

2
Evet ... Birçok ios geliştiricisi için bir şeyin semptomu gösteriyor olması, bunun sebebi olmamasının da garantili olduğu anlamına gelmediğini düşünüyorum. Apple'ın bir hata yapmış olabileceğini kabul etmenin de zor olduğunu düşünüyorum.
ScottyBlades

157

Bazen ana iş parçacığında çalıştırılmayan UI kodunu bulmak zor. Bulmak ve düzeltmek için aşağıdaki numarayı kullanabilirsiniz.

  1. Şemayı Düzenle -> Tanılama'yı seçin, Ana Konu Denetleyicisi'ni işaretleyin.

    Xcode 11.4.1

    Ana İş Parçacığı Denetleyicisi kesme noktası oluşturmak için Ana İş Parçacığı Denetleyicisi'nin yanındaki küçük oka tıklayın. görüntü açıklamasını buraya girin

    Önceki Xcode

    Sorunlar için Duraklat'ı işaretleyin. görüntü açıklamasını buraya girin

  2. Bu sorunu yeniden oluşturmak için iOS uygulamanızı çalıştırın. (Xcode ilk sayıda duraklamalıdır.) görüntü açıklamasını buraya girin

  3. Kullanıcı arayüzünü değiştiren kodu sarın DispatchQueue.main.async {} görüntü açıklamasını buraya girin


4
Teşekkürler, bana 30 dakika ayırın.
Orange

10
Bazı nedenlerden dolayı, bunu Xcode 10.1'de yaptığımda, yalnızca çaresiz ve bir kod satırıyla ilişkilendiremeyeceğim bir çağrı yığını alıyorum: 2018-12-29 19: 46: 56.500629 + 0100 BedtimePrototype [1553: 834478] [raporlar ] Ana İş Parçacığı Denetleyicisi: Arka plan iş parçacığında çağrılan UI API: - [UIApplication applicationState] PID: 1553, TID: 834478, İş parçacığı adı: com.apple.CoreMotion.MotionThread, Kuyruk adı: com.apple.root.default-qos. overcommit, QoS: 0
Vilmir

1
Ayrıca çaresiz görünen bir çağrı yığınım var. Sol tarafta durdu "com.apple.CoreMotion.MotionThread(23)", sonra diğer tüm konuları da kontrol ettim. Bir Thread 1şey dikkatimi çekti: SVProgressHUD (kullandığım bir ilerleme görünümü kitaplığı). Yani, bunun SVProgressHUD.show()hedef görüntü denetleyicisinde bir yere çağrı olduğunu biliyorum . Sonra ya her bir görünümü sarın ya DispatchQueue.main.asyncda basitçe yorum yapın, tekrar test edin ve hangisinin sorunlu olduğunu anladım.
John Pang

2
Ayrıca SVProgressHUD.show'a yorum yaparak uyarıdan kurtuldum. Bu aramayı bir DispatchQueue.main.async'e sarmak uyarıdan kurtulmadı. Bölmeyi v2.2.5'te kullanıyorum Bu iş parçacığı, sorunun daha iyi anlaşılmasına yardımcı olabilir: github.com/SVProgressHUD/SVProgressHUD/issues/950
Vilmir

1
"Sorunları Duraklat" onay kutusu xcode 11.4.1'de benim için orada değil. Düzenleme: Ana Konu Denetleyicisi'nin yanında küçük bir ok buldum. Bunu tıklamak sizin için bir kesme noktası ekler.
ChrisO

47

DispatchQueue.main.async {}Ana iş parçacığı üzerinde yürütüldüğünden emin olmak için kullanıcı arayüzünü değiştiren kod satırlarını sarın . Aksi takdirde, onları UI değişikliklerine izin verilmeyen bir arka plan iş parçacığından çağırıyor olabilirsiniz. Bu tür tüm kod satırları ana iş parçacığından yürütülmelidir.


4
evet bunu zaten kullandım ama uyarı hala mevcut
MattBlack

@Pang, ana UI kodu için değil, bir şeyler yazdırmak için kullanılır.
Toma

4
Üzerinde UI değiştirmek her şeyi sarmak için denemek @MattBlackDispatchQueue.main.async {}
Toma

@ user6603599-Tılsım gibi çalışıyor
Sree



-34

Şema seçin -> Teşhis, ana iş parçacığı denetleyicisini kaldırın, ardından uyarı kaybolacaktır. şema düzenleyici


18
Bunun iyi bir fikir olduğunu sanmıyorum. Burada iş parçacığı denetleyicisinin keşfettiği bir sorun var. İş parçacığı denetleyicinin devre dışı bırakılması, bu ve gelecekteki sorunların keşfedilmeden kalmasına izin verecek ve sorunları gidermek için gelecekte teknik borca ​​girilmesine neden olacaktır.
ablarg

1
Aslına bakarsan, bunu OpenGL es oluşturmayı kullandığımızda yapabiliriz çünkü ana iş parçacığında çerçeve tamponunu işleyemiyoruz. sağ?
L.Peng

1
Ah, yani uyarı görünmüyorsa sorun yok mu?
2017

11
"Duman dedektörüm neden sürekli sönüyor?" "Sadece pili çıkarın, sorun çözüldü."
John Montgomery

Uyarı görünmezse sorun mevcut değil mi?
S.Gissel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.