作为一个快速的初学者,我正在构建一个简单的应用程序,它将从网站获取数据以更新标签文本。
在ViewController.swift中,我从一个名为requestCycle()的函数开始:
override func viewDidLoad() {
super.viewDidLoad()
requestCycle()
}
在这个requestCycle()函数中,我创建了一个定时器来调用http请求函数basicAuthHttpRequest():
func requestCycle(){
self.timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(ViewController.basicAuthHttpRequest), userInfo: nil, repeats: true);
RunLoop.current.add(self.timer, forMode: RunLoopMode.commonModes);
}
在basicAuthHttpRequest()函数中,我设置了一个http请求来从url获取数据,并使用这些数据来更新标签文本:
...
//http request, parse json, store the data in TempIn
let TempInString = String(describing: TempIn!)
self.TempInLabel.text = TempInString
print(TempInString)
print(self.TempInLabel.text!)
...
当我运行应用程序时,将打印数据(“33”和可选(“33”))并且不会出现错误。但是,显示的标签文本根本没有变化。 如果我使用按钮触发函数basicAuthHttpRequest(),单击按钮后,标签文本将在几秒钟内更改。
我的可怜的计时器出了什么问题? =。=
答案 0 :(得分:1)
您必须更新主线程上的文本。
DispatchQueue.main.async {
let TempInString:String = String(describing: TempIn!)
self.TempInLabel.text = TempInString as String
}
答案 1 :(得分:1)
尝试以下代码: -
DispatchQueue.main.async(execute: { self.TempInLabel.text = TempInString as String })
答案 2 :(得分:1)
计时器正在后台线程上运行。所以你必须用主线程更新标签值。您必须使用以下代码。
self.performSelector(onMainThread: #selector(updateUI), with: nil, waitUntilDone: true)
func updateUI() {
print("here update your UI")
}
您也可以使用OperationQueue.
OperationQueue.main.addOperation({
print("here update your UI")
})