ETBinding 3.0

ETBinding 3.0

Jan Čislinský 维护。



  • 作者:
  • Jan Cislinsky

iOS 绑定

Version License Platform Build Status

灵感来源于 Android 架构组件中的LiveData


Observables 概念

可以观察的有三个类:LiveDataFutureEventSingleEvent

LiveDataFutureEvent 实现了 Observable 协议。《SingleEvent 是 FutureEvent 的特殊情况,并实现了 SingleEventObservable 协议。

与常规观察模式不同,Observable(以及 SingleEventObservable)是生命周期感知的,这意味着它尊重其所有者的生命周期。这种感知确保 Observable 只更新处于活动状态的组件观察者。

您可以为与 LifecycleOwner(AnyObject 的别名)对象配对的观察者进行注册。这种关系允许当相应 LifecycleOwner 的状态更改为释放时移除观察者。这对于视图控制器特别有用,因为它们可以安全地观察视图模型中的对象,而不用担心内存泄漏。

何时使用 LiveDataFutureEventSingleEvent

  • LiveData – 保持状态/数据。可以观察状态的变化。
  • FutureEvent – 不保存状态,只在事件触发时通知观察者。事件可以有相关的值。
  • SingleEvent – 是 FutureEvent 的特殊情况。只传递首次触发的事件。

优点

无内存泄漏

观察者绑定到生命周期对象,在其关联的生命周期被销毁时自行清理。

安全的 [非拥有 self]

由于观察者绑定到生命周期,因此当 LifecycleOwner 被销毁时,观察者永远不会更新。

不再需要手动处理生命周期

UI 组件仅观察相关数据,而不会停止观察。《Observable》会自动管理这一点,因为它在观察时知道相关生命周期状态的变化。

安装

CocoaPods

在 Podfile 中添加 pod 'ETBinding'

Carthage

在 Cartfile 中添加 github "EtneteraMobile/ETBinding"

使用方法

按照以下步骤与LiveData对象一起工作

  1. 创建一个LiveData实例来存储特定类型的数据。这通常在您的ViewModel类中完成。
  2. 创建一个Observer对象,该对象定义了更新闭包,用于控制LiveData对象的数据更改时发生什么。您通常在视图控制器中创建Observer对象。
  3. 使用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。