前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS14开发-Timer

iOS14开发-Timer

作者头像
YungFan
发布2021-11-24 15:02:45
8550
发布2021-11-24 15:02:45
举报
文章被收录于专栏:学海无涯学海无涯

定时器可以设置按固定周期执行某个操作。iOS 中主要有 3 种定时器,本文先讲解第一种 Timer。

使用

  • iOS 10 之后下面的方法不会出现循环引用的问题,推荐使用。
代码语言:javascript
复制
// 自动执行的Timer
// 参数一:时间间隔,参数二:是否重复执行
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in  
    // 定期执行的代码
    print("Hello World")
}

// 需要手动开启的Timer
let timer = Timer(timeInterval: 2.0, repeats: true) { (timer) in  
    // 定期执行的代码
    print("Hello World")
}

RunLoop

  • 用来处理事件的循环,保持程序持续运行,App 启动后会开启一个主线程,主线程启动时会运行一个对应的 RunLoop,RunLoop 保证主线程不会被销毁,从而保证了程序的持续运行。
  • RunLoop 工作模式有 5 种,常见模式有以下 3 种:
    • default:默认模式。
    • tracking:界面跟踪模式。
    • common:通用模式,前面 2 种的结合。
  • 将 Timer 添加到 RunLoop 后会自动开始工作。
代码语言:javascript
复制
// 界面发生拖拽就会停止执行
RunLoop.current.add(timer, forMode: .default)
// 界面拖拽才会执行
RunLoop.current.add(timer, forMode: .tracking)
// 上面两种模式的结合,常用
RunLoop.current.add(timer, forMode: .common)

暂停与重启

代码语言:javascript
复制
// 暂停
timer.fireDate = Date.distantFuture
// 重启
timer.fireDate = Date.distantPast

销毁

invalidate:阻止 Timer 再次触发并请求将其从 RunLoop 中删除,因此这种方式停止后无法让其重新开始工作。

代码语言:javascript
复制
timer.invalidate()

案例:倒计时

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {
    // 倒计时总时长(秒)
    var count = 5
    // 定时器
    var timer: Timer!
    // UILabel+UITapGestureRecognizer比UIButton好
    lazy var label: UILabel = {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 30))
        label.center = view.center
        label.text = "获取倒计时"
        label.textAlignment = .center
        label.isUserInteractionEnabled = true
        label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleCount)))
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(label)
    }

    @objc func handleCount() {
        // 倒计时过程中不允许点击
        label.isUserInteractionEnabled = false

        // 创建Timer,每隔1s执行一次
        timer = Timer(timeInterval: 1.0, repeats: true) { _ in
            // 显示倒计时
            self.label.text = "\(self.count)"
            // 计时减1
            self.count -= 1
            // 当计时为0时
            if self.count == 0 {
                // 停止计时
                self.timer.invalidate()
                // 改变文字
                self.label.text = "重新获取"
                // 允许交互
                self.label.isUserInteractionEnabled = true
                // 恢复倒计时总时长
                self.count = 5
            }
        }

        // 添加RunLoop,定时器开始工作
        RunLoop.current.add(timer, forMode: .common)
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/9/16 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用
  • RunLoop
  • 暂停与重启
  • 销毁
  • 案例:倒计时
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档