无法使用swift中的计时器更改标签文本

时间:2017-08-29 07:23:22

标签: ios swift timer

作为一个快速的初学者,我正在构建一个简单的应用程序,它将从网站获取数据以更新标签文本。

在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(),单击按钮后,标签文本将在几秒钟内更改。

我的可怜的计时器出了什么问题? =。=

3 个答案:

答案 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")            
})