প্রধান থ্রেড পরীক্ষক: ইউআই এপিআই একটি পটভূমির থ্রেডে কল করেছে: - [ইউআইএএপ্লিকেশন অ্যাপ্লিকেশন স্টেট]


107

আমি এক্সকোড 9 বিটা, আইওএস 11 এ গুগল ম্যাপ ব্যবহার করছি।

আমি লগতে নিম্নরূপে একটি ত্রুটি পেয়েছি:

প্রধান থ্রেড পরীক্ষক: ইউআই এআইপি একটি পটভূমির থ্রেডে কল করেছে: - [ইউআইএপ্লিকেশন অ্যাপ্লিকেশন স্টেট] পিআইডি: 4442, টিআইডি: 837820, থ্রেডের নাম: com.google.Maps.LabelingBehaviar, সারির নাম: com.apple.root.default-qos.overcommit , কিউএস: 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)")
        }
    }

1
ইন mapView(_:didChange)আপনি ডিসপ্যাচিং হয় printপ্রধান সারিতে বিবৃতি। আপনি কি ইতিমধ্যে মূল কাতারে নেই? যদি তা না হয়, আপনাকেও animateমূল কাতারে কলটি প্রেরণ করতে হবে। আমি dispatchPrecondition(condition: .onQueue(.main))এই ইউআই আপডেটগুলির আগে কয়েকটি সন্নিবেশ করানোর পরামর্শ দিচ্ছি , কেবলমাত্র তা নিশ্চিত করার জন্য।
রব

আপনি বলেছিলেন "আমি প্রায় নিশ্চিত যে আমি আমার কোডের মূল থ্রেড থেকে কোনও ইন্টারফেস উপাদান পরিবর্তন করছি না।" আমি ধরে নিলাম আপনার অর্থ "... কোনও পটভূমির থ্রেড থেকে"।
রব

2
আপনার সমস্যা নয়। আমি এটা তাদের শেষ হয়। এটি "com.google.Maps.LabelingBehavior" এ থামে। আমারও একই সমস্যা।
তারভো মেসেপ্প

2
হাই, হ্যাঁ এটি
হ'ল, সমস্যাটি গুগলের

1
: @MattBlack এই উত্তর কটাক্ষপাত stackoverflow.com/a/44392584/5912335
badhanganesh

উত্তর:


53

প্রথমে নিশ্চিত হয়ে নিন যে মূল থ্রেড থেকে আপনার গুগল ম্যাপ এবং ইউআই পরিবর্তনগুলির আমন্ত্রণ আহ্বান করা হয়েছে।

আপনি থ্রেড স্যানিটাইজারকে আপত্তিজনক লাইনগুলি সন্ধান করতে সক্ষম করতে পারেন ।

আপনি নিম্নলিখিত দিয়ে মূল থ্রেডে আপত্তিজনক রেখাগুলি রাখতে পারেন:

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

এছাড়াও, আপনার Google মানচিত্রের বর্তমান সংস্করণ আপডেট করুন। গুগল ম্যাপগুলিতে থ্রেড চেকারের জন্য বেশ কয়েকটি আপডেট করতে হয়েছিল।

প্রশ্নের জন্য: "কেন এটি ঘটবে?" আমি মনে করি অ্যাপল একটি যোগ কথন একটি প্রান্ত ক্ষেত্রে যা Google তারপর তাদের শুঁটি আপডেট করতে পেরেছিলেন।


1
@ থাইবাউত্তনোহ, আপনি কি বলছেন যে "গুগল এর এপিআই এর সাথে আপনি এক্সকোড 9 বিটা ব্যবহার করছেন বলে" এটি (সমস্যা) ঘটছে তা আমি বলেছি না বলে? " বা আপনি একই ধরণের বাগের মুখোমুখি হচ্ছেন যা আমার উত্তর দ্বারা সমাধান করা হচ্ছে না?
স্কটিবিলেডস

7
এক্সকোড 9 কিছু থ্রেডিংয়ের বিষয়গুলি হাইলাইট করেছে যা এক্সকোড 8 দৃশ্যত সনাক্ত করতে পারে না (এটি এক্সকোড সেটিংসের কারণে হয়েছে বা অন্য কোনও বিষয় নির্ধারণ করা উচিত)। এক্সকোড 8 এ ফিরে যাওয়া আপনার থ্রেডিংয়ের বিষয়গুলি উপেক্ষা করার সমতুল্য, তারা এখনও আছে এবং সমাধান করা হয় না, সুতরাং এটি কোনও সমাধান নয়, আপনি কেবল আপনার বালিকে বালিতে কবর দিচ্ছেন এবং সবকিছু ঠিকঠাক করছেন বলে ঠিক করছেন। যদি সমস্যাটি কোনও ফ্রেমওয়ার্ক থেকে আসছে তবে দয়া করে একটি সমস্যা জমা দিন যাতে এটি স্থির করা যায়।
থাইবাট নোয়া

এক্সকোড 9 থ্রেডিংয়ের সমস্যাগুলি সনাক্ত করে যা এক্সকোড 8 সনাক্তকরণের প্রস্তাব দেয় না এবং গুগলের API এর সাথে Xcode 9 সম্ভবত এই বাগের কারণ হতে পারে। এই বাগটি একাধিক ক্র্যাশের জন্য ডিবাগারে
বসেছে

আপনার বক্তব্যটি হ'ল থ্রেড চেকার কারণটি নয় লক্ষণটি দেখাচ্ছে। আমি বলছি এক্সকোড 9 বিটা কারণ এবং লক্ষণ যোগাযোগকারী উভয়ই। "আপনি এক্সকোড 8 এ ফিরে গেলে ক্র্যাশগুলি আর ঘটবে না"। এক্সকোড সতর্কতা এবং ডিবাগার রিডআউটগুলির সাথে প্রকৃত ক্র্যাশের মধ্যে পার্থক্য রয়েছে। এই ত্রুটিটি একটি সতর্কতা বা ক্র্যাশ হিসাবে দেখাতে পারে। এক্সকোড ৮-এ ফিরে যাওয়ার সময় ক্র্যাশটি পুরোপুরি চলে যায় X একটি ভাল কারণে এক্সকোড 9 বিটা কে বিটা বলা হয়।
স্কটিব্ল্যাডেস

2
হ্যাঁ ... আমি মনে করি অনেক আইওএস বিকাশকারীদের পক্ষে এটি দেখতে শক্ত হয় যে কোনও কারণ লক্ষণটি দেখানো হচ্ছে, এর অর্থ এই নয় যে এটি কারণ হিসাবে নাও গ্যারান্টিযুক্ত। আমি মনে করি এটি গ্রহণ করাও কঠিন যে অ্যাপল কখনও ভুল করেছে।
স্কটিবিলেডস

156

মূলত থ্রেডে কখনও কখনও চালিত হয় না এমন ইউআই কোড খুঁজে পাওয়া শক্ত। আপনি এটি সনাক্ত করতে এবং এটি ঠিক করতে নীচের কৌশলটি ব্যবহার করতে পারেন।

  1. সম্পাদনা স্কিম -> ডায়াগনস্টিকস নির্বাচন করুন, মূল থ্রেড পরীক্ষকটিকে টিক দিন।

    এক্সকোড 11.4.1

    একটি মেইন থ্রেড চেকার ব্রেকপয়েন্ট তৈরি করতে মেইন থ্রেড চেকারের পাশের ছোট তীরটি ক্লিক করুন। এখানে চিত্র বর্ণনা লিখুন

    পূর্ববর্তী এক্সকোড

    ইস্যুতে বিরতিতে টিক দিন। এখানে চিত্র বর্ণনা লিখুন

  2. এই সমস্যাটি পুনরুত্পাদন করতে আপনার iOS অ্যাপ্লিকেশনটি চালান Run (এক্সকোডের প্রথম ইস্যুতে বিরতি দেওয়া উচিত)) এখানে চিত্র বর্ণনা লিখুন

  3. কোডটি মোড়ান যা ইউআই-তে সংশোধন করে DispatchQueue.main.async {} এখানে চিত্র বর্ণনা লিখুন


4
ধন্যবাদ, আমাকে 30 মিনিট বাঁচাতে পারেন।
কমলা

10
কোনও কারণে, যখন আমি এক্সকোড 10.1 এ করি, তখন আমি কেবল একটি কলস্ট্যাক পাই যা অসহায় এবং আমি কোনও কোড লাইনের সাথে সম্পর্ক রাখতে পারি না: 2018-12-29 19: 46: 56.500629 + 0100 শয়নকালীন প্রোটোটাইপ [1553: 834478] [প্রতিবেদনগুলি ] মূল থ্রেড পরীক্ষক: ইউআই এআইপি ব্যাকগ্রাউন্ড থ্রেডে কল করেছে: - [ইউআইএপ্লিকেশন অ্যাপ্লিকেশন স্টেট] পিআইডি: 1553, টিআইডি: 834478, থ্রেডের নাম: com.apple.CoreMotion.MotionThread, সারির নাম: com.apple.root.default-qos।
ওভারকমিট, কিউএস

1
আমি একটি কল স্ট্যাক পেয়েছি যা অসহায় দেখাচ্ছে। বাম দিকে এটি থামল "com.apple.CoreMotion.MotionThread(23)", তারপরে আমি অন্যান্য সমস্ত থ্রেডও পরীক্ষা করে দেখি। ইন Thread 1কিছু আমার মনোযোগ ধরা: এটা SVProgressHUD (আমি ব্যবহৃত একটি উন্নতি দৃশ্য গ্রন্থাগার) হয়। সুতরাং, আমি জানি এটি SVProgressHUD.show()লক্ষ্য ভিউ কন্ট্রোলারের কোথাও কল । তারপরে হয় প্রতিটি উপস্থিতিটি মুছে ফেলুন DispatchQueue.main.asyncবা কেবল মন্তব্য করুন, আবার পরীক্ষা করুন এবং আমি খুঁজে পেয়েছি কোনটি সমস্যাযুক্ত।
জন পানং

2
আমি এসভিপ্রোগ্রেসএইচডিডি শোতে মন্তব্য করে সতর্কতা থেকে মুক্তি পেয়েছি। এই কলটিকে একটি DispatchQueue.main.async এ মোড়ানো সতর্কতা থেকে মুক্তি পান না। আমি v2.2.5 এ পোড ব্যবহার করি এই থ্রেডটি সমস্যাটি আরও ভালভাবে বুঝতে সহায়তা করতে পারে: github.com/SVProgressHUD/SVProgressHUD/issues/950
ভিল্মির

1
"ইস্যুতে বিরতি" চেকবক্সটি আমার জন্য এক্সকোড 11.4.1 এ নেই। সম্পাদনা: আমি মূল থ্রেড পরীক্ষকের পাশে একটি ছোট তীর পেয়েছি। ক্লিক করা যা আপনার জন্য একটি ব্রেকপয়েন্ট যোগ করে।
ক্রিসও

47

কোডটির লাইনগুলি মোড়ানো যা ইউআইকে সংশোধন করে DispatchQueue.main.async {}যাতে তারা মূল থ্রেডে চালিত হয়। অন্যথায়, আপনি তাদের পটভূমি থ্রেড থেকে কল করতে পারেন, যেখানে ইউআই পরিবর্তনের অনুমতি নেই। কোডের এই জাতীয় সমস্ত লাইন অবশ্যই মূল থ্রেড থেকে কার্যকর করা উচিত।


4
হ্যাঁ আমি এটি ইতিমধ্যে ব্যবহার করেছি তবে সতর্কতাটি এখনও উপস্থিত রয়েছে
ম্যাটব্ল্যাক

@ পাং, এটি মুদ্রিত জিনিসগুলির জন্য ব্যবহৃত হয়, মূল ইউআই কোডের জন্য নয়।
দিমিত্রি-তোমা ফুরডুই

4
@ ম্যাটব্ল্যাক সমস্ত কিছু মোড়ানোর চেষ্টা করুন যা ইউআই-তে পরিবর্তন করেDispatchQueue.main.async {}
দিমিত্রি-তোমা ফুরডুই

@ user6603599 - কবজির মতো কাজ করে
শ্রী

3

এই লিঙ্কটি https://developer.apple.com/docamentation/code_diagnostics/main_thread_checker দেখুন

আমার জন্য এটি কাজ করেছিল যখন আমি ব্লক থেকে ফোন করেছি।


1
আপনি যদি সুইফট 4+ ব্যবহার করেন তবে এটি সেরা সমাধানটি নিখুঁতভাবে কাজ করে, আমার সময় বাঁচাতে আমাকে সহায়তা করার জন্য আপনাকে ধন্যবাদ। আমি স্কিম এডিটর দিয়ে খেলেছি তবে অ্যাপলের পরামর্শ অনুসরণ করা এখন সেরা বিকল্প এবং এগিয়ে যাওয়া।
আবুতারেক


-34

স্কিম চয়ন করুন -> ডায়াগনোটিক্স, মূল থ্রেড পরীক্ষক সরান, তারপরে সতর্কতা অদৃশ্য হয়ে যাবে। স্কিম সম্পাদক


18
আমি এটি একটি ভাল ধারণা বলে মনে করি না। থ্রেড চেকার আবিষ্কার করেছে যে এখানে একটি সমস্যা আছে। থ্রেড চেকারকে অক্ষম করার ফলে এটি এবং ভবিষ্যতের সমস্যাগুলি অনাবৃত হয়ে যাবে এবং সমস্যাগুলির সমাধানের জন্য ভবিষ্যতের প্রযুক্তিগত debtণ ব্যয় করতে হবে।

1
প্রকৃতপক্ষে, আমার বক্তব্যটি হ'ল আমরা যখন ওপেনজিএল এস রেন্ডারিং ব্যবহার করি তখন আমরা এটি করতে পারি, কারণ আমরা মূল থ্রেডে ফ্রেম বাফার রেন্ডার করতে পারি না। ঠিক আছে?
L.Peng

1
আহা, সুতরাং যদি ওয়ারিংটি উপস্থিত না হয় তবে সমস্যাটি বিদ্যমান না?
13:25 এ ট্যুরিজিংসড

11
"কেন আমার ধূমপান সনাক্তকারী বন্ধ রাখছে?" "কেবল ব্যাটারি সরান, সমস্যার সমাধান হয়েছে" "
জন মন্টগোমেরি

সতর্কতাটি উপস্থিত না হলে সমস্যাটি বিদ্যমান না?
এস গিজেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.