iOS 绑定
灵感来源于 Android 架构组件中的LiveData。
Observables 概念
可以观察的有三个类:LiveData
、FutureEvent
和 SingleEvent
。
LiveData
和 FutureEvent
实现了 Observable
协议。《SingleEvent 是 FutureEvent
的特殊情况,并实现了 SingleEventObservable
协议。
与常规观察模式不同,Observable
(以及 SingleEventObservable
)是生命周期感知的,这意味着它尊重其所有者的生命周期。这种感知确保 Observable
只更新处于活动状态的组件观察者。
您可以为与 LifecycleOwner
(AnyObject 的别名)对象配对的观察者进行注册。这种关系允许当相应 LifecycleOwner
的状态更改为释放时移除观察者。这对于视图控制器特别有用,因为它们可以安全地观察视图模型中的对象,而不用担心内存泄漏。
LiveData
、FutureEvent
和 SingleEvent
何时使用 LiveData
– 保持状态/数据。可以观察状态的变化。FutureEvent
– 不保存状态,只在事件触发时通知观察者。事件可以有相关的值。SingleEvent
– 是FutureEvent
的特殊情况。只传递首次触发的事件。
优点
无内存泄漏
观察者绑定到生命周期对象,在其关联的生命周期被销毁时自行清理。
安全的 [非拥有 self]
由于观察者绑定到生命周期,因此当 LifecycleOwner
被销毁时,观察者永远不会更新。
不再需要手动处理生命周期
UI 组件仅观察相关数据,而不会停止观察。《Observable》会自动管理这一点,因为它在观察时知道相关生命周期状态的变化。
安装
CocoaPods
在 Podfile 中添加 pod 'ETBinding'
。
Carthage
在 Cartfile 中添加 github "EtneteraMobile/ETBinding"
。
使用方法
按照以下步骤与LiveData
对象一起工作
- 创建一个
LiveData
实例来存储特定类型的数据。这通常在您的ViewModel类中完成。 - 创建一个
Observer
对象,该对象定义了更新闭包,用于控制LiveData
对象的数据更改时发生什么。您通常在视图控制器中创建Observer
对象。 - 使用
observe
方法将Observer
对象附加到LiveData
对象。该方法需要一个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
多次,但每个 观察者只会在新值上调用一次。值设置器是带有版本的,观察者保存最后传递的值版本,并阻止传递已传递的版本的分发。
贡献
欢迎并向 ETBinding 贡献!
许可证
ETBinding 在 MIT 许可证下可用。查看 LICENSE 获取更多信息。
归属权
我使用了 SwiftPlate 来生成与 CocoaPods 和 Carthage 兼容的 xcodeproj。