Observable 是在 Swift 中观察值的最容易的方式。
如何
创建 Observable 和 MutableObservable
使用 MutableObservable
,您可以创建和观察事件。使用 Observable
,您可以观察事件,以避免对我们内部 API 产生副作用。
class SomeViewModel {
/// Public property, that can be read / observed by external classes (e.g. view controller), but not changed.
var position: Observable<CGPoint> = {
return positionSubject
}
// Or use the helper method Observable.asObservable()
// lazy var position = positionSubject.asObservable()
/// Private property, that can be changed / observed inside this view model.
private let positionSubject = MutableObservable(CGPoint.zero)
}
创建带有自定义 onDispose 功能的观察器
在某些情况下,Observables 在激活时需要资源,并且在它们被销毁时必须清理。为了处理这类情况,您可以将一个可选块传递给 Observable 初始化器,以便在 Observable 被销毁时执行。
url.startAccessingSecurityScopedResource()
let observable = Observable([URL]()) {
url.stopAccessingSecurityScopedResource()
}
作为@MutableObservable的模型属性
现在将绑定/映射属性标记为可观察的,并导出公共可观察对象
//Private Observer
@MutableObservable var text: String = "Test"
//add observer
_text.observe { (newValue, oldValue) in
print(newValue)
}.add(to: &disposable)
//Public Observer
var textObserve: ImmutableObservable<String> {
return _text
}
添加观察者
position.observe { p in
// handle new position
}
添加观察者并指定DispatchQueue
position.observe(DispatchQueue.main) { p in
// handle new position
}
更改值
position.wrappedValue = p
停止监听新值
position.observe {
// This will stop all observers added to `disposal`
self.disposal.dispose()
}.add(to: &disposal)
内存管理
对于单个观察者,您可以将返回的Disposable
存储在一个变量中
disposable = position.observe { p in
对于多个观察者,您可以向Disposal
变量添加可处理项
position.observe { }.add(to: &disposal)
并且在您的观察器内部引用self
时,始终弱化self
position.observe { [weak self] position in
安装
CocoaPods
Observable 可通过 CocoaPods 使用。要安装它,只需将以下行添加到您的 Podfile 中
pod 'Observable'
Swift 包管理器
Observable 可通过 Swift Package Manager
得到。 Swift Package Manager (SwiftPM) 是一个用于自动化 Swift 代码分布的工具。它集成到 Swift 编译器中,Xcode 11 之后,SwiftPM 已原生集成到 Xcode 中。
dependencies: [
.package(url: "https://github.com/roberthein/Observable", from: "VERSION")
]
迁移
1.x.y 至 2.0.0
Observable
现在变为MutableObservable
ImmutableObservable
现在变为Observable
Observable.asImmutableObservable()
现在变为Observable.asObservable()
Observable.value
现在变为Observable.wrappedValue
建议或反馈?
请随意创建一个拉取请求、打开一个问题或在我的 Twitter 上找到我 (https://twitter.com/roberthein)。