2017-07-06 14 views
7

मैं जाँच की है क्या में Xcode 9 प्रलेखन नया क्या है, मैं इसक्या Xcode में मुख्य थ्रेड परीक्षक है 9

enter image description here

लगता है लेकिन मुझे समझ क्या है कि मैं कैसे नए के साथ इस का उपयोग कर सकते नहीं समझे Xcode 9

+1

क्या आपने एक सरल [Google खोज] (https://www.google.com/search?q=Main+Thread+checker) का प्रयास किया था? – deadbeef

+1

कोई अच्छी तरह से समझाया गया समाधान नहीं मिला – suthar

+1

https://developer.apple.com/documentation/code_diagnostics/main_thread_checker – deadbeef

उत्तर

14

Apple documentation से:

मुख्य थ्रेड परीक्षक स्विफ्ट और सी भाषाओं के लिए एकमात्र साधन है कि पृष्ठभूमि धागे पर ऐपकिट, UIKit, और अन्य API के अमान्य उपयोग का पता लगाता है। मुख्य थ्रेड के अलावा किसी थ्रेड पर यूआई को अपडेट करना एक आम गलती है जिसके परिणामस्वरूप मिस्ड यूआई अपडेट, विजुअल दोष, डेटा भ्रष्टाचार और क्रैश हो सकते हैं।

उदाहरण एक पृष्ठभूमि धागा काम नहीं करेगा पर एक UILabel की text संपत्ति को बदलने की कोशिश कर के लिए

तो। ऐप्पल का कहना है कि इसका परिणाम में यूआई अपडेट, विजुअल दोष, डेटा भ्रष्टाचार और क्रैश हो सकता है। व्यावहारिक रूप से, 99% समय के परिणामस्वरूप यादृच्छिक मिस्ड यूआई अपडेट और दृश्य दोष (और क्रैश नहीं) होगा।

क्रैश वास्तव में अच्छा होगा क्योंकि हम आसानी से UIKit के इस तरह के अनुचित उपयोग का पता लगा सकते हैं, लेकिन यादृच्छिक दृश्य दोष विकास के दौरान पता लगाने के लिए बहुत कठिन हैं। और यहीं मुख्य थ्रेड परीक्षक में आता है है।

मुख्य थ्रेड परीक्षक एक पृष्ठभूमि धागे पर dectect UIKit की का उपयोग करता है में मदद मिलेगी, यह उन्हें का समाधान नहीं होगा। एक बार जब आप पृष्ठभूमि थ्रेड पर UIKit का उपयोग कर चुके हैं, तो आप इसे DispatchQueue का उपयोग करके हल कर सकते हैं।

फिर, Apple documentation से:

URLSession के प्रलेखन का कहना है कि पूरा होने के बंद होने के एक पृष्ठभूमि धागे पर बुलाया जाएगा, तो यह बुरा है, मुख्य थ्रेड परीक्षक आप एक पृष्ठभूमि पर UIKit के उपयोग का पता लगाने में मदद मिलेगी धागा।

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
    if let data = data {  
     self.label.text = "\(data.count) bytes downloaded" 
     // Error: label updated on background thread 
    } 
} 
task.resume() 

समाधान: उपयोग DispatchQueue.main मुख्य थ्रेड पर यूआई अद्यतन करने के लिए।

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
    if let data = data { 
     DispatchQueue.main.async { // Correct 
     self.label.text = "\(data.count) bytes downloaded" 
     } 
    } 
} 
task.resume() 

समाधान के पास एक्सकोड के साथ कुछ भी नहीं है, यह भाषा की एक विशेषता है। तो जाहिर है कि यह एक्सकोड के पिछले संस्करणों में संभव था, लेकिन एक्सकोड 9 से पहले आपके पास समस्या का पता लगाने में मदद करने के लिए मुख्य थ्रेड चेकर नहीं था।

@hamish बताते हैं, तो आप अधिक विस्तृत स्पष्टीकरण के लिए the WWDC video भी देख सकते हैं।

17

इसे योजना के निदान विकल्प में सक्षम/अक्षम किया जा सकता है। इसके अलावा, "मुद्दों पर रोकें" इन समस्याओं को डीबग करने का एक आरामदायक विकल्प है।

Example

+0

अच्छा स्पष्टीकरण के साथ प्रयास करें, धन्यवाद –

0

अनुभाग जाँच हो रही है रनटाइम एपीआई के तहत, यह सुनिश्चित करें कि मुख्य थ्रेड परीक्षक यदि आप एक गैर यूआई धागा

enter image description here

enter image description here में ui तरीकों को क्रियान्वित कर रहे हैं देखने के लिए सक्षम किया गया है

संबंधित मुद्दे