灵感来源于 Android Architecture Components 的 LiveData。
有三种类可以被观察:LiveData、FutureEvent 和 SingleEvent。
LiveData 和 FutureEvent 实现了 Observable 协议。SingleEvent 是 FutureEvent 的一个特殊情况,并实现了 SingleEventObservable 协议。
与常规的观察者模式不同,Observable (和 SingleEventObservable) 是生命周期感知的,这意味着它尊重其所有者的生命周期。这种感知确保 Observable 仅更新处于活动生命周期状态的应用程序组件观察者。
您可以注册一个与 LifecycleOwner (类型别名为 AnyObject) 对象配对的观察者。这种关系允许在相应的 LifecycleOwner 的状态更改为释放时删除观察者。这对于视图控制器特别有用,因为它们可以安全地从视图模型中观察对象,而不必担心内存泄漏。
LiveData – 保存状态/数据。状态变化可以被观察。FutureEvent – 不保存状态,仅在事件被触发时通知观察者。事件可以具有关联的值。SingleEvent – 是 FutureEvent 的一个特殊情况。仅传递第一个被触发的事件。观察者绑定到生命周期对象,并在其关联的生命周期被销毁后自行清理。
由于观察者绑定到生命周期,因此永远不会发生 LifecycleOwner 被释放后观察者仍被更新的情况。
UI 组件只需观察相关数据,而不停止观察。由于 Observable 在观察时知道相关的生命周期状态变化,因此它可以自动管理这一点。
将 pod 'ETBinding' 添加到您的 Podfile 中。
将 github "EtneteraMobile/ETBinding" 添加到您的 Cartfile 中。
在 Xcode (>11.0) 中,转到 File -> Swift Packages -> Add Package Dependency。在 URL 输入框中插入 https://github.com/EtneteraMobile/ETBinding,然后完成将 ETBinding 导入到您的项目。
按照以下步骤来使用 LiveData 对象
LiveData 实例来保存特定类型的数据。这通常在您的 ViewModel 类中完成。Observer 对象,它定义了更新闭包,该闭包控制当 LiveData 对象保存的数据发生更改时会发生什么。您通常在视图控制器中创建一个 Observer 对象。observe 方法将 Observer 对象附加到 LiveData 对象。observe 方法接受一个 LifecycleOwner 对象。这会将 Observer 对象订阅到 LiveData 对象,以便在发生更改时收到通知。注意: 您可以使用 observeForever 方法注册一个没有关联 LifecycleOwner 对象的观察者。在这种情况下,观察者被认为是始终处于活动状态,因此始终会收到有关修改的通知。您可以通过调用 removeObserver 方法来删除这些观察者。
当您更新存储在 LiveData 对象中的值时,只要附加的 LifecycleOwner 处于活动状态,它就会触发所有已注册的观察者。
观察仅使用所有者和更新闭包开始,然后返回 Observer 的新实例。 如果将来不需要删除,则可以忽略此观察者。
let liveData: LiveData<String> = LiveData()
let observer = liveData.observe(owner: self) { data in
// do something with data
}
// observer can be used for later unregistration
更新闭包可以封装在 Observer 内部,然后注册。 当将来启动观察时,可以使用此模式。
let observer: Observer<String?> = Observer(update: { data in
// do something with data
})
// … and later
let liveData: LiveData<String> = LiveData()
liveData.observe(owner: self, observer: observer)
// observer can be used for later unregistration
生命周期所有者并非始终是强制性的。 当未给出所有者时,取消注册由您控制。
let liveData: LiveData<String> = LiveData()
let observer = liveData.observeForever { data in
// do something with data
}
// observer can be used for later unregistration
let observer: Observer<String?> = Observer(update: { data in
// do something with data
})
// … and later
let liveData: LiveData<String> = LiveData()
liveData.observeForever(observer: observer)
// observer can be used for later unregistration
从 liveData 更改观察中取消注册给定的观察者。
// … observer is obtained from early called function `observe`
liveData.remove(observer: observer)
启动观察后,值不会自动分发给观察者。 如果要获取当前值,可以直接从 data 变量中读取,也可以调用 dispatch,更新将传递给新注册的观察者。
// Dispatches value to observers that were registered from last dispatch
liveData.dispatch()
// Dispatches value to given observer if is newly registered from last dispatch
liveData.dispatch(initiator: observer)
每个观察者对于每个新值仅被调用一次,即使多次调用 dispatch。 值 setter 是版本化的,观察者持有最后传递的值版本,并阻止分发已经传递的版本。
欢迎并鼓励对 ETBinding 做出贡献!
ETBinding 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE。
我使用 SwiftPlate 生成与 CocoaPods 和 Carthage 兼容的 xcodeproj。