Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO。
内容概览
- 前言
- 用
KVO
监控改动 - 将
KVO
代码迁移到Combine
- 总结
前言
KVO
([Key-Value Observing](Using Key-Value Observing in Swift)) 是苹果开发者常用的功能,很多框架都会使用 KVO
来发送异步改动。将基于回调和闭包的 KVO
代码迁移到 Combine
,可以使你的代码更优雅、更易维护。
用 KVO 监控改动
在下面的示例中, UserInfo
类型为它的 lastLogin
属性提供了 KVO
支持。示例代码在 viewDidLoad()
方法中调用了 observe(_:options:changeHandler:)
方法来创建了一个处理这个属性的变动的闭包。这个闭包接收一个描述了改动事件的 NSKeyValueObservedChange
对象,并从这个对象取出了 newValue
属性的值,然后打印。
接下来,示例代码在 viewDidAppear(_:)
方法中改了 lastLogin
属性的值,最终触发了闭包并打印了消息。
class UserInfo: NSObject {
@objc dynamic var lastLogin: Date = Date(timeIntervalSince1970: 0)
}
@objc var userInfo = UserInfo()
var observation: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
observation = observe(\.userInfo.lastLogin, options: [.new]) { object, change in
print ("lastLogin now \(change.newValue!).")
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
userInfo.lastLogin = Date()
}
将 KVO 代码迁移到 Combine
想要迁移 KVO
代码到 Combine
,只需替换 observe(_:options:changeHandler:)
方法为 NSObject.KeyValueObservingPublisher
。您可以通过在父对象(parent object)上调用 publisher(for:)
方法来获得此发布者的实例,如以下示例的 viewDidLoad()
方法所示:
class UserInfo: NSObject {
@objc dynamic var lastLogin: Date = Date(timeIntervalSince1970: 0)
}
@objc var userInfo = UserInfo()
var cancellable: Cancellable?
override func viewDidLoad() {
super.viewDidLoad()
cancellable = userInfo.publisher(for: \.lastLogin)
.sink() { date in print ("lastLogin now \(date).") }
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
userInfo.lastLogin = Date()
}
KVO发布者
会生成观察类型的元素(在本例中为 Date
),而不是 NSKeyValueObservedChange
。这样就节省了一步操作,因为你不必像前一个示例中那样从 change
对象中获取 newValue
。
总结
如果上面的示例变得更加复杂,传统的 KVO
代码可能会变得非常臃肿,而基于 Combine
的 KVO
代码可以利用各种操作符进行链式调用。这样,就可以让代码更优雅,同时保持代码的易读性。对于以后维护这段代码的人来说,这将是一种辛福的感觉~
朋友,行动起来吧!把现有项目中的旧代码重构成使用 Combine
的代码~
本文内容来源:
Performing Key-Value Observing with Combine
Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO的更多相关文章
- 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 中使用计时器
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用计时器. 内容概览 前言 使用计时器执行周期性的工作 将计时器转换为计时 ...
- 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 ...
随机推荐
- 【USACO13DEC】 最优挤奶 - 线段树
题目描述 FJ最近买了1个新仓库, 内含N 个挤奶机,1 到N 编号并排成一行. 挤奶机i 每天能产出M(i) 单位的奶.不幸的是, 机器装得太近以至于如果一台机器i 在某天被使用, 那与它相邻的两台 ...
- jupyter 安装 卸载 包
# 安装 !pip install 库名 # 卸载 !pip uninstall 库名 -y
- UML活动图(Activity Diagram)
目录: 1.什么是活动图 2.活动图的构成 (1)起点 (2)重点 (3)活动名称 (4)判断条件 (5)同步条 (6)接收信号 (7)发送信号 (8)泳道 (9)转移 3.活动图实例--订单处理 4 ...
- JavaScript学习系列博客_13_JavaScript中的对象(Object)简介
对象 对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性.除了那5种基本数据类型,就是对象. 分类:1.内建对象- 由ES标准中定义的对象,在任何的ES的实现中都可以使用- 比如:Ma ...
- python2-dpkt 下载
原文链接:https://centos.pkgs.org/7/forensics-x86_64/python2-dpkt-1.9.2-2.el7.noarch.rpm.html .Download c ...
- Linux离线安装mysql 5.6详细步骤
一.安装MySQL 1.下载安装包 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 2.卸载系统自带的Mariadb rpm -qa|grep mariadb / ...
- 正则表达式断言精讲 Java语法实现
目录 断言 1.2.3.1 情景导入 什么是断言 断言的语法规则 零宽断言为什么叫零宽断言 零宽 前行 负向 断言DEMO 断言的基础应用和实际用处 验证不包含 验证开头包含 验证开头包含且匹配到的数 ...
- android开发之edittext弹出输入框遮挡住文字。解决方法
在ManiFest清单文件中修改被遮挡的类的EditText android:windowSoftInputMode="adjustPan|stateHidden"
- IOS 打包相关
Unity 导出的Xcode工程 http://gad.qq.com/article/detail/29330 [Unity3D]Unity 生成的XCode工程结构 http://blog.163. ...
- 数据库系统第一章【绪论】(B站视频)
目录 数据库系统第一章[绪论](B站视频) 一.绪论 数据库的四大基本概念 数据 数据库 数据库管理系统 主要功能 数据库系统 数据管理 我的理解 数据系统的特点 数据结构化 数据系统的共享性 数据独 ...