【问题标题】:Swift Update Label (with HTML content) takes 1minSwift 更新标签(带有 HTML 内容)需要 1 分钟
【发布时间】:2014-09-01 10:05:23
【问题描述】:

我有个小问题,让我从代码开始

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”需要大约 30 秒。

我不知道为什么这需要这么长时间,有人知道吗?

【问题讨论】:

    标签: swift label self swift-playground


    【解决方案1】:

    在辅助线程中更新 UI 的常见问题:

    您的闭包显然没有在主线程上运行,因为 URL 任务是异步的。所以更新闭包上的标签将不得不等待主线程运行它的更新循环。修复它的方法是包装 .text = 调用以强制它在主线程上运行(无论如何,这是 UI 东西应该运行的地方):

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

    【讨论】:

    • 我不知道为什么这个示例只打印 test3 和 test4 并以 xcode 6.1.1 为我显示 test5 的标签结束。我将代码复制到一个新的单视图 swift 项目中,并连接了一个标签和按钮。我的部署目标是 os ios 8.1。 Xcode 不会让它运行,直到我将“dataTaskWithURL(url)”更改为“dataTaskWithURL(url!)”(带感叹号),但这是我对示例代码所做的唯一更改。我的电脑有互联网连接,我尝试在模拟器和 iPhone 上运行。 5 分钟后标签仍然显示“test5”。我错过了一些明显的东西吗?谢谢。
    • 错误变量中有什么?您的 url 调用一定失败了。
    【解决方案2】:

    在 Swift 3 中:

    DispatchQueue.main.async
    {
        self.LBoutput.text = "test6"
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2011-06-17
      • 2015-07-03
      • 2019-04-02
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多