本文首发于 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 代码可能会变得非常臃肿,而基于 CombineKVO 代码可以利用各种操作符进行链式调用。这样,就可以让代码更优雅,同时保持代码的易读性。对于以后维护这段代码的人来说,这将是一种辛福的感觉~

朋友,行动起来吧!把现有项目中的旧代码重构成使用 Combine 的代码~

 

本文内容来源:

Performing Key-Value Observing with Combine

 

Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO的更多相关文章

  1. Combine 框架,从0到1 —— 1.核心概念

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 1.核心概念.     内容概览 前言 核心概念 RxSwift Combine 总结 参考内容 ...

  2. Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 2.通过 ConnectablePublisher 控制何时发布.   内容概览 前言 使用 ma ...

  3. Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 3.使用 Subscriber 控制发布速度.   内容概览 前言 在发布者生产元素时消耗它们 使 ...

  4. Combine 框架,从0到1 —— 4.在 Combine 中使用通知

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用通知.   内容概览 前言 让通知处理代码使用 Combine 总结 ...

  5. Combine 框架,从0到1 —— 4.在 Combine 中使用计时器

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用计时器. 内容概览 前言 使用计时器执行周期性的工作 将计时器转换为计时 ...

  6. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...

  7. Combine 框架,从0到1 —— 5.Combine 提供的发布者(Publishers)

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 提供的发布者(Publishers). 内容概览 前言 Just Future D ...

  8. Combine 框架,从0到1 —— 5.Combine 中的 Subjects

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 中的 Subjects. 内容概览 前言 PassthroughSubject C ...

  9. Combine 框架,从0到1 —— 5.Combine 常用操作符

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 常用操作符. 内容概览 前言 print breakpoint handleEve ...

随机推荐

  1. Python+Pytest+Allure+Git+Jenkins接口自动化框架

    Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...

  2. 学习Python(新手教程链接)

    1.这个是地址: https://www.ggdoc.com/cHl0aG9uIG1zaeaYr_S7gOS5iA2/NTY4Nzc1MWQxMDJkZTJiZDk3MDU4OGE20/

  3. java集合初探(一):HashMap.

    一.概述 HashMap可能是我们最经常用的Map接口的实现了.话不多说,我们先看看HashMap类的注释: 基于哈希表的Map接口实现. 这个实现提供了所有可选的映射操作,并允许空值和空键.(Has ...

  4. Js中的各种高度问题

    一.屏幕宽高相关 屏幕高度就是你的整个屏幕高度(开机会亮的那片区域的高度),相关的其他高度划分很简单,就是以任务栏为分界线从而分为两部分. screen.height :屏幕高度. screen.wi ...

  5. ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解

    前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  6. 使用Kali中的Metasploit生成木马控制Windows系统

    一.概念:Kali基于debin的数字取证系统,上面集成了很多渗透测试工具,其前身是BT5 R3(BtackTrack). 其中Metasploit是一个综合利用工具,极大的提高了攻击者的渗透效率,使 ...

  7. DML语言(数据操纵语言)

    #DML语言/*数据操作语言:插入:insert修改:update删除:delete */ #一.插入语句#方式一:经典的插入/*语法:insert into 表名(列名,...) values(值1 ...

  8. Magento1.9 add attribute to catalog product & assign to all attribute set general group

    $installer = $this; $attributes = array( 'region' => array( 'type' => 'int', 'input' => 'se ...

  9. ansible实现批量建立互信

    Ansible:自动化运维工具 为什么要建立互信:ansible批量配置管理的前提是管理机和被管理机ssh互信,即通过将管理主机的公钥(id_rsa.pub)添加到目标主机上,实现管理机不通过交互式输 ...

  10. MySQL数据库下统计记录数小于指定数值的数据

    楼主在做一个智慧工地的产品,需要对工人进行一些数据统计,比如要统计导入人员数量小于30的工地,SQL应该怎么写呢? 首先了解一下数据结构,工地分三张表,四级层级关系,Organization表存储区域 ...