swift计时器_Swift:如何在组合中创建计时器

swift计时器

In this tutorial we will learn how to create a simple repeating timer using a built-in Combine’s publisher.

在本教程中,我们将学习如何使用内置的Combine的发布者创建简单的重复计时器。

We will do so by quickly implementing it in an Xcode Playground.

我们将通过在Xcode Playground中快速实现它来做到这一点。

The full source code is available at the bottom of the article.

完整的源代码位于文章底部。

开始吧 (Let’s Start)

First we need to create a Set of AnyCancellable where we will store our timer subscription:

首先,我们需要创建一个AnyCancellable SetAnyCancellable存储计时器订阅:

Now let’s specify the starting Date we will use for our timer:

现在,让我们指定将用于计时器的开始Date

We can create a timer by using the .publish method on the Foundation’s Timer class (we specify the value of 1.0 as a parameter, because we want to print a value every second):

我们可以通过在Foundation的Timer类上使用.publish方法来创建计时器(我们将值1.0指定为参数,因为我们想每秒打印一个值):

The .autoconnect() allows us to start a timer once we have a subscriber. If we don’t use that operator, then we will need to call .connect() manually.

.autoconnect()允许我们在有订阅者后启动计时器。 如果不使用该运算符,则需要手动调用.connect()

Let’s now obtain the TimeInterval and transform it into an Int using the .map operator:

现在,我们获取TimeInterval并使用.map运算符将其转换为Int

All that is left is to subscribe for the publisher and store the resulting subscription in our previously defined Set of AnyCancellables:

所有剩下的认购发行所得订阅存储在我们先前定义SetAnyCancellable S:

As a result, we have the seconds printed out:

结果,我们打印出了几秒钟:

Image for post

翻译自: https://medium.com/cleansoftware/swift-how-to-create-a-timer-in-combine-43192dab4d3

swift计时器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift ,主要有以下三种计时器: 1. `Timer`:这是一个基础的计时器,可以周期性地执行某些任务。 2. `DispatchSourceTimer`:这是一个基于 GCD 的计时器,可以更加精确地执行任务。 3. `CADisplayLink`:这是一个适用于游戏和动画的计时器,可以根据屏幕的刷新率来调整任务的执行时间。 下面分别介绍它们的使用方法: ### Timer 使用 `Timer` 类可以创建一个基础的计时器。以下是一个示例: ```swift class ViewController: UIViewController { var timer: Timer? var counter = 0 override func viewDidLoad() { super.viewDidLoad() // 创建计时器,并设置时间间隔为1秒 timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) } @objc func updateTimer() { counter += 1 print("计时器已运行\(counter)秒") } // 在需要停止计时器的地方调用 invalidate() 方法 // timer?.invalidate() } ``` 在上面的示例,我们创建了一个计时器,并设置时间间隔为1秒。每当计时器时间间隔到达时,都会调用 `updateTimer` 方法,其我们可以执行一些操作,比如更新 UI 或者执行一些逻辑。在需要停止计时器的地方,可以调用 `invalidate()` 方法来停止计时器。 ### DispatchSourceTimer 使用 `DispatchSourceTimer` 类可以创建一个更加精确的计时器。以下是一个示例: ```swift class ViewController: UIViewController { var timer: DispatchSourceTimer? var counter = 0 override func viewDidLoad() { super.viewDidLoad() // 创建计时器,设置时间间隔为1秒 timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main) timer?.schedule(deadline: .now(), repeating: .seconds(1)) timer?.setEventHandler(handler: { [weak self] in self?.counter += 1 print("计时器已运行\(self?.counter ?? 0)秒") }) // 启动计时器 timer?.resume() } // 在需要停止计时器的地方调用 cancel() 方法 // timer?.cancel() } ``` 在上面的示例,我们创建了一个计时器,并设置时间间隔为1秒。每当计时器时间间隔到达时,都会调用 `setEventHandler` 方法的闭包,其我们可以执行一些操作,比如更新 UI 或者执行一些逻辑。在需要停止计时器的地方,可以调用 `cancel()` 方法来停止计时器。 ### CADisplayLink 使用 `CADisplayLink` 类可以创建一个适用于游戏和动画的计时器。以下是一个示例: ```swift class ViewController: UIViewController { var displayLink: CADisplayLink? var startTime: CFTimeInterval = 0 override func viewDidLoad() { super.viewDidLoad() // 创建计时器 displayLink = CADisplayLink(target: self, selector: #selector(updateTimer)) displayLink?.add(to: .main, forMode: .common) // 记录开始时间 startTime = CACurrentMediaTime() } @objc func updateTimer() { let currentTime = CACurrentMediaTime() let elapsedTime = currentTime - startTime print("计时器已运行\(elapsedTime)秒") } // 在需要停止计时器的地方调用 invalidate() 方法 // displayLink?.invalidate() } ``` 在上面的示例,我们创建了一个计时器,并使用 `add(to:forMode:)` 方法将其添加到主循环。每当屏幕需要刷新时,都会调用 `updateTimer` 方法,其我们可以执行一些操作,比如更新游戏或者动画。在需要停止计时器的地方,可以调用 `invalidate()` 方法来停止计时器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值