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

微信扫一扫,分享到朋友圈

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
的代码~

微信扫一扫,分享到朋友圈

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

依然年轻!aigo的国民好物理念

上一篇

99%的PS4游戏都能玩:索尼称PS5国行后续推出 价格有优势

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友