2014-09-01 8 views
8

मैं एक छोटी सी समस्या है, मुझे कोडस्विफ्ट अद्यतन लेबल लेता 1min

class ViewController: UIViewController { 

@IBOutlet weak var LBoutput: UILabel! 
@IBAction func BTclick(sender: AnyObject) { 
    var url = NSURL(string: "http://google.com") 
    println("test0") 
    let getdata = NSURLSession.sharedSession().dataTaskWithURL(url){(data ,response , error) in 
     var htmlContent = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("test1") 
     println("test2") 
     self.LBoutput.text = "test6" 
    } 
    println("test3") 
    getdata.resume() 
    println("test4") 
    LBoutput.text = "test5" 

} 

से शुरू करते हैं इस कोड को मुझे

test0
के कंसोल में एक उत्पादन दे test3
test4
test1 test2

इसके अलावा लेबल अपडेट करने के लिए " test5 "बिना किसी समय के, लेकिन" test6 "को अपडेट करने के लिए लेबल 30sec की तरह लगता है।

मुझे कोई संकेत नहीं है कि यह इतना लंबा क्यों लगता है, किसी को भी कोई विचार है? के लिए द्वितीयक थ्रेड में यूआई अद्यतन करने का

उत्तर

31

सामान्य समस्या:

आपका बंद स्पष्ट रूप से के रूप में URL कार्य अतुल्यकालिक है, मुख्य थ्रेड पर नहीं चल रहा है। इसलिए बंद होने पर लेबल को अपडेट करने के लिए मुख्य थ्रेड को अपने अपडेट लूप को चलाने के लिए इंतजार करना होगा।

 dispatch_async(dispatch_get_main_queue()) { 
      self.LBoutput.text = "test6" 
     } 
+0

कि इसे ठीक किया गया धन्यवाद रिकिक्स –

+0

मुझे यकीन नहीं है कि यह नमूना केवल टेस्ट 3 और टेस्ट 4 क्यों प्रिंट कर रहा है और एक्सकोड 6.1.1 के साथ मेरे लिए test5 दिखा रहे लेबल के साथ समाप्त होता है। मैंने कोड को एक नए एकल दृश्य स्विफ्ट प्रोजेक्ट में कॉपी किया और एक लेबल और बटन को जोड़ा। मेरा परिनियोजन लक्ष्य ओएस आईओएस 8.1 है। एक्सकोड इसे तब तक नहीं चलाएगा जब तक कि मैंने "डेटाटास्क विथ्लर (यूआरएल)' "डेटा" डेटा टास्क विथ्लर (यूआरएल!) '" (विस्मयादिबोधक बिंदु के साथ) बदल दिया है, लेकिन यह नमूना कोड में केवल एक ही बदलाव है। मेरे कंप्यूटर में एक इंटरनेट कनेक्शन है, और मैंने सिम्युलेटर और आईफोन पर चलने की कोशिश की। लेबल अभी भी 5 मिनट के बाद "test5" कहता है। क्या मुझे कुछ याद आ रही है? धन्यवाद। – miker

+0

त्रुटि चर में क्या है? आपका यूआरएल कॉल असफल होना चाहिए। – Rikkles

0

स्विफ्ट 3 में:: जिस तरह से यह तय करने के लिए (जहां यूआई सामान वैसे भी चलाना चाहिए है) यह मुख्य थ्रेड पर चलाने के लिए मजबूर करने के लिए .text = कॉल रैप करने के लिए है

DispatchQueue.main.async 
{ 
    self.LBoutput.text = "test6" 
} 
संबंधित मुद्दे