ios - 为什么我的 UILabel 文本在 Xcode 8.1 的 Swift3 中没有改变

标签 ios swift swift3

我需要每 20 秒更新一次 UILabel 文本。 这里一切正常,但我的 UILabel 没有改变。

数据也从 URL 和短语正确加载。当我尝试 self.team1Score = "1"viewDidLoad 然后它工作。

请查看我的代码并建议我如何每 20 秒更改一次 UILabel 文本。

import UIKit

class WatchLiveVideo: UIViewController {

    @IBOutlet var team1Score: UILabel!
    @IBOutlet var team2Score: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.getScore()
        //run getScore in every 20 Seconds
        _ = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(WatchLiveVideo.self.getScore), userInfo: nil, repeats: true)
    }

    func getScore()
    {
        let myUrl = URL(string: "http://myurl.com");
        var request = URLRequest(url:myUrl!)

        request.httpMethod = "POST"// Compose a query string

        //input data bind to send server
        let streamID = getStreamID

        let postString = "streamID=\(streamID)"

        request.httpBody = postString.data(using: String.Encoding.utf8)

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            if error != nil
            {
                print("error=\(error)")
                return
            }

            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                if let parseJSON = json {
                    let status = parseJSON["status"] as? String
                    let team1 = parseJSON["team1"] as? String
                    let team2 = parseJSON["team2"] as? String

                    if(status == "1")
                    {
                        self.team1Score.text = team1
                        self.team2Score.text = team2 
                    }
                    else if(status == "0")
                    {
                        print("No Score Found")
                    }
                }
            } catch {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }    

}

最佳答案

您需要在主线程中进行 UI 更新。因此,请尝试按如下方式包装您的标签更新代码,以便它由主线程运行:

DispatchQueue.main.async {
        self.team1Score.text = team1
        self.team2Score.text = team2     
}

我刚刚添加了一个 demo project向您说明我提供的答案有效。我刚刚做了一个非常像您提供的代码的示例。我每 20 秒远程调用一次公共(public)休息服务,并更新主队列中的标签,就像我上面提到的那样。您可以下载并运行该应用程序以查看它是否正常工作。

关于ios - 为什么我的 UILabel 文本在 Xcode 8.1 的 Swift3 中没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949111/

相关文章:

ios - swift 中的单元格 ImageView cornerRadius

ios - Swift 3-“NSPersistentContainer仅在ios 10和更高版本上可用”

range - Swift 3.0 范围作为函数参数

swift - 在循环内的 swift 3 中创建延迟

iphone - 带有状态的 UIButton 图像

ios - 核心图形和数组

ios - 修改 UITabBarController 的“更多”选项卡中显示的选项卡导航栏上的“更多”按钮

ios - 使用 spritekit 使 Sprite 快速移动

swift - 如何从 firebase 读取数据

swift - NSDateFormatter dateFromString 为 "2015-11-20 13:42:00.000000"返回 nil