Observable 是在 Swift 中观察值的最简单方法。
使用 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)
}
在某些情况下,Observables 在活动期间需要资源,这些资源在被释放时必须清理。 为了处理这种情况,您可以将一个可选的闭包传递给 Observable 初始化程序,以便在 Observable 被释放时执行该闭包。
url.startAccessingSecurityScopedResource()
let observable = Observable([URL]()) {
url.stopAccessingSecurityScopedResource()
}
现在将你的绑定/映射属性标记为 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
}
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
Observable 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到你的 Podfile 中
pod 'Observable'
Observable 可通过 Swift Package Manager
获得。 Swift Package Manager (SwiftPM) 是一个用于自动化 Swift 代码分发的工具。 它已集成到 swift 编译器中,并且从 Xcode 11 开始,SwiftPM 已与 Xcode 本地集成。
dependencies: [
.package(url: "https://github.com/roberthein/Observable", from: "VERSION")
]
Observable
现在是 MutableObservable
ImmutableObservable
现在是 Observable
Observable.asImmutableObservable()
现在是 Observable.asObservable()
Observable.value
现在是 Observable.wrappedValue
随时创建 pull request,打开 issue 或在 Twitter 上找到我。