2014-09-01 22 views
8

Tôi có một vấn đề nhỏ, hãy để tôi bắt đầu với mãSwift Cập nhật Label (với nội dung HTML) mất 1 phút

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" 

} 

mã này cho tôi một đầu ra trong giao diện điều khiển của

test0
Test3
test4
test1
test2

Ngoài ra các bản cập nhật nhãn " test5 "không có thời gian, nhưng nhãn để cập nhật thành" test6 "mất khoảng 30 giây.

Tôi không biết tại sao quá lâu, bất kỳ ai có ý tưởng?

Trả lời

31

vấn đề thông thường của việc cập nhật giao diện người dùng trong một sợi thứ cấp:

đóng cửa của bạn là rõ ràng không phải chạy trên các chủ đề chính, là nhiệm vụ URL là không đồng bộ. Vì vậy, việc cập nhật nhãn trên bao đóng sẽ phải đợi chuỗi chính chạy vòng lặp cập nhật của nó. Cách để sửa chữa nó là để quấn .text = gọi để buộc nó để chạy trên các chủ đề chính (đó là nơi các công cụ giao diện người dùng nên chạy anyway):

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

Đó cố định nó nhờ Rikkles –

+0

Tôi không chắc tại sao mẫu này chỉ in test3 và test4 và kết thúc bằng nhãn hiển thị test5 cho tôi với xcode 6.1.1. Tôi đã sao chép mã vào một dự án xem nhanh mới và kết nối với một nhãn và nút. Mục tiêu triển khai của tôi là os ios 8.1. Xcode sẽ không cho phép nó chạy cho đến khi tôi thay đổi "' dataTaskWithURL (url) '" thành "' dataTaskWithURL (url!) '" (Với dấu chấm than) nhưng đó là thay đổi duy nhất tôi đã thực hiện đối với mã mẫu. Máy tính của tôi có kết nối internet và tôi đã thử chạy trên trình mô phỏng và iphone. Nhãn vẫn nói "test5" sau 5 phút. Tôi có thiếu điều gì đó hiển nhiên không? Cảm ơn. – miker

+0

Có gì trong biến lỗi? Cuộc gọi url của bạn phải không thành công. – Rikkles

0

Trong Swift 3:

DispatchQueue.main.async 
{ 
    self.LBoutput.text = "test6" 
} 
Các vấn đề liên quan