我需要每 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/