iOS 绑定

Version License Platform Build Status

灵感来源于 Android Architecture Components 的 LiveData


可观察对象概念

有三种类可以被观察:LiveDataFutureEventSingleEvent

LiveDataFutureEvent 实现了 Observable 协议。SingleEventFutureEvent 的一个特殊情况,并实现了 SingleEventObservable 协议。

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

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

何时使用 LiveDataFutureEventSingleEvent

优点

无内存泄漏

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

安全的 [unowned self]

由于观察者绑定到生命周期,因此永远不会发生 LifecycleOwner 被释放后观察者仍被更新的情况。

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

UI 组件只需观察相关数据,而不停止观察。由于 Observable 在观察时知道相关的生命周期状态变化,因此它可以自动管理这一点。

安装

CocoaPods

pod 'ETBinding' 添加到您的 Podfile 中。

Carthage

github "EtneteraMobile/ETBinding" 添加到您的 Cartfile 中。

Swift Package Manager

在 Xcode (>11.0) 中,转到 File -> Swift Packages -> Add Package Dependency。在 URL 输入框中插入 https://github.com/EtneteraMobile/ETBinding,然后完成将 ETBinding 导入到您的项目。

用法

按照以下步骤来使用 LiveData 对象

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