Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 —— 4.在 Combine 中使用计时器。
内容概览
- 前言
- 使用计时器执行周期性的工作
- 将计时器转换为计时器发布者(
Timer.TimerPublisher
) - 总结
前言
计时器是苹果开发者常用的功能。如果你的应用使用 Foundation
框架中的计时器 Timer
来周期性地执行某些操作,你可以用 Combine
简化这些代码。
现在,让我们来学习如何使用 Combine
处理计时器,并将已有的计时器处理代码迁移到 Combine
。
使用计时器执行周期性的工作
对于 iOS
开发人员而言,以下代码一定非常眼熟:
var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
self.myDispatchQueue.async() {
self.myDataModel.lastUpdated = Date()
}
}
}
以上代码使用 scheduledTimer(withTimeInterval:repeats:block:)
来实现每秒钟在 myDispatchQueue
中更新 self.myDataModel.lastUpdated
的功能。
将计时器转换为计时器发布者(Timer.TimerPublisher
)
要将以上代码迁移到 Combine
,只需将 Timer
(scheduledTimer(withTimeInterval:repeats:block:)
的返回值) 替换为 Timer.TimerPublisher
。调用 Timer. publish(every:tolerance:on:in:options:)
方法即可创建一个发布者。
每次底层的计时器(Timer
)触发时,发布者都会发出一个新的日期(Date
)实例,该日期代表计时器触发的瞬间。然后,你可以将 Combine
操作符应用到这个日期实例上,最终将这个发布者和一个订阅者(如:sink(receiveValue:)
或 assign(to:on:)
)连接。
由于
Timer.TimerPublisher
遵从ConnectablePublisher
协议,因此在您显式地连接之前,它不会产生任何元素。为此,可以通过手动调用connect()
或使用autoconnect()
运算符在订阅者连接时自动连接来实现。关于ConnectablePublisher
的用法,可以参考 这篇文章。
下一个示例将展示如何使用 Timer.TimerPublisher
替换上一个示例。它使用 Combine
的操作符来完成上一个示例中的闭包中的操作:
var cancellable: Cancellable?
override func viewDidLoad() {
super.viewDidLoad()
cancellable = Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.receive(on: myDispatchQueue)
.assign(to: \.lastUpdated, on: myDataModel)
}
在这个例子中,Combine
操作符替换了上一个示例的闭包中的所有行为:
receive(on:options:)
操作符确保了后续操作在指定的调度队列中执行,它替代了前面用到的async()
调用;assign(to:on:)
操作符通过键路径来更新数据模型的lastUpdated
属性;
使用 Combine
来简化你的代码时,你会发现 Timer.TimerPublisher
会产生新的 Date
实例作为其输出类型。而第一个示例的闭包是将 Timer
本身作为其参数,因此它必须手动创建新的 Date
实例。
总结
使用 Combine
来简化你的计时器代码时,你会发现:
- 代码易读性明显提升;
- 线程切换变得更简单;
- 数据模型的更新可以通过键路径(
key path
)来简化;
朋友,行动起来吧!把现有项目中的旧代码重构成使用 Combine
的代码~
本文内容来源:
Replacing Foundation Timers with Timer Publishers
Combine 框架,从0到1 —— 4.在 Combine 中使用计时器的更多相关文章
- Combine 框架,从0到1 —— 1.核心概念
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 1.核心概念. 内容概览 前言 核心概念 RxSwift Combine 总结 参考内容 ...
- Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 2.通过 ConnectablePublisher 控制何时发布. 内容概览 前言 使用 ma ...
- Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 3.使用 Subscriber 控制发布速度. 内容概览 前言 在发布者生产元素时消耗它们 使 ...
- Combine 框架,从0到1 —— 4.在 Combine 中使用通知
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用通知. 内容概览 前言 让通知处理代码使用 Combine 总结 ...
- Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用 KVO. 内容概览 前言 用 KVO 监控改动 将 KVO 代 ...
- Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...
- Combine 框架,从0到1 —— 5.Combine 提供的发布者(Publishers)
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 提供的发布者(Publishers). 内容概览 前言 Just Future D ...
- Combine 框架,从0到1 —— 5.Combine 中的 Subjects
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 中的 Subjects. 内容概览 前言 PassthroughSubject C ...
- Combine 框架,从0到1 —— 5.Combine 常用操作符
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 常用操作符. 内容概览 前言 print breakpoint handleEve ...
随机推荐
- Django中的异常
DJango除了会抛出Python的标准异常外还有一些框架自带的异常. 1. Django核心异常 在django.core.exceptions中:| ObjectDoesNotExist | Fi ...
- 对象原型之__proto__
对象都会有一个__proto__指向构造函数的prototype原型对象,对象之所以能够使用构造函数的prototype原型对象的方法,就是因为有__proto__原型的存在. funct ...
- K8S(11)配置中心实战-单环境交付apollo三组件
k8s配置中心实战-交付apollo三组件 目录 k8s配置中心实战-交付apollo三组件 1 apollo简单说明 1.1 apollo最简架构图: 1.2 apollo组件部署关系 2 为app ...
- day 10 面向对象(=)
1.魔法对象 __str _(self) 使用print(对象)输出的时候,自动调用该方法 return语句 返回一个值 class 类名: del _str ...
- JavaScript 基础三
遍历对象的属性 for...in 语句用于对数组或者对象的属性进行循环操作. for (变量 in 对象名字) { 在此执行代码 } 这个变量是自定义 符合命名规范 但是一般我们 都写为 k 或则 k ...
- js使用html2canvas 生成图片然后下载
1:html2canvas官网 首先去官网把这个JS下载下来 <!DOCTYPE html> <html lang="en"> <head> & ...
- Android 用versionName判断版本大小(是否进行版本更新)
一般情况下都是用versionCode进行版本大小的判断从而进行判断是否进行app的更新,但是有可能从网站上爬下来的versionCode不准确,有的网站叫做build,所以用versionName进 ...
- 关于haar特征的理解及使用(java实现)
Haar特征原理综述Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征.它分为三类:边缘特征.线性特征.中心特征和对角线特征.如下所示: Haar-like矩形特征拓展 Lienha ...
- 二叉搜索树及java实现
二叉搜索树(Binary Search Tree) 二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为 BST 又被称为:二叉查找树.二叉排序树 任意一个节点的值都大于其左子树所有节 ...
- Windows下搭载虚拟机以及环境安装
前言 最近回到家中进行赛前自主提升 模拟赛考虑到考试环境是NOI Linux 而大多数同学电脑环境为Windows 有同学想要模拟真实考试环境 但是NOI Linux的系统过于"阉割版&qu ...