Observable

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

现在将你的绑定/映射属性标记为 observable 并导出公共 observable

//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

对于多个观察者,你可以将 disposable 添加到 Disposal 变量中

position.observe { }.add(to: &disposal)

并且在 observer 中引用 self 时,始终弱化 self

position.observe { [weak self] position in

安装

CocoaPods

Observable 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到你的 Podfile 中

pod 'Observable'

Swift Package Manager

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

建议或反馈?

随时创建 pull request,打开 issue 或在 Twitter 上找到我