栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Swift Timer.scheduledTimer()不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Swift Timer.scheduledTimer()不起作用

计时器不适用于后台队列(不费吹灰之力就涉及创建运行循环或在现有运行循环上手动调度它)。但是无论如何,您绝不应该从主队列之外的任何其他位置启动任何UI更新。

因此,由于您是

performSegue
URLSession
完成关闭(在后台队列中运行)调用的,因此它实际上也
viewDidLoad
从后台队列中运行。因此,计划计时器的尝试失败。要解决此问题,您必须手动将
performSegue
代码分发到主队列:

let task = URLSession.shared.dataTask(with: url!) { data, response, error in    ...    if isPassed != "null" {        DispatchQueue.main.async { self.performSegue(withIdentifier: "gotoGame", sender: ...)        }    }}

如果您不确定主队列上是否正在运行某些代码,请参阅文档。或者,您可以使用调度先决条件:

dispatchPrecondition(condition: .onQueue(.main))

这样,如果您不小心从后台队列中调用了代码,它将(在调试版本中)停止应用程序。


与您当前的问题无关,但顺便说一句,为避免计时器和视图控制器之间的引用周期过长,通常需要保留对计时器的引用,以便

invalidate
在视图消失时可以使用它(例如,在
viewDidAppear
和中创建计时器)。将其删除
viewDidDisappear
)。否则,您可以
GameViewController
在将其关闭后保留它们,例如:

class GameViewController: UIViewController {    weak var timer: Timer?    override func viewDidAppear(_ animated: Bool) {        super.viewDidAppear(animated)        timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(setCalculationLs(_:)), userInfo: nil, repeats: true)    }    override func viewDidDisappear(_ animated: Bool) {        super.viewDidDisappear(animated)        timer?.invalidate()    }    @objc func setCalculationLs(_ timer: Timer) {        print("Tick")    }}

或在iOS 10或更高版本中,您可以在和中使用基于块的变体,并

weak
参考:
self``invalidate``deinit

class GameViewController: UIViewController {    weak var timer: Timer?    override func viewDidLoad() {        super.viewDidLoad()        timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] timer in self?.setCalculationLs()        }    }    deinit {        timer?.invalidate()    }    func setCalculationLs() {        print("Tick")    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425777.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号