मैं जाँच की है क्या में Xcode 9 प्रलेखन नया क्या है, मैं इसक्या Xcode में मुख्य थ्रेड परीक्षक है 9
लगता है लेकिन मुझे समझ क्या है कि मैं कैसे नए के साथ इस का उपयोग कर सकते नहीं समझे Xcode 9
मैं जाँच की है क्या में Xcode 9 प्रलेखन नया क्या है, मैं इसक्या Xcode में मुख्य थ्रेड परीक्षक है 9
लगता है लेकिन मुझे समझ क्या है कि मैं कैसे नए के साथ इस का उपयोग कर सकते नहीं समझे Xcode 9
उदाहरण एक पृष्ठभूमि धागा काम नहीं करेगा पर एकमुख्य थ्रेड परीक्षक स्विफ्ट और सी भाषाओं के लिए एकमात्र साधन है कि पृष्ठभूमि धागे पर ऐपकिट, 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 भी देख सकते हैं।
क्या आपने एक सरल [Google खोज] (https://www.google.com/search?q=Main+Thread+checker) का प्रयास किया था? – deadbeef
कोई अच्छी तरह से समझाया गया समाधान नहीं मिला – suthar
https://developer.apple.com/documentation/code_diagnostics/main_thread_checker – deadbeef