Bind 是一个用于简单响应式编程的框架,旨在替代像 RxSwift 这样的框架。它可以与 Promise 的实现一起使用,例如 When。
Output 是一个存储通用可变属性和一组闭包的容器,当该属性更新时,这些闭包将被调用。在我们的架构中,Output 通常在 View Model 中使用。
Initialising (初始化)
一个 Output 使用它的初始值进行初始化,或者以 nil 作为其初始值开始。
Updating (更新)
Output 存储的值可以通过调用其 update
函数来更新。该函数还会调用绑定到 Output 的任何闭包。
Bind
调用 bind 函数之一会将一个闭包添加到由 Output 维护的闭包字典中,并且如果存在当前存储的值,也会调用该闭包。
bind 可以直接使用闭包调用,也可以通过传递一个或多个 Binder 调用
Binder
定义了一个在 Output
更新时要调用的闭包。 Binder
通常从符合 Bindable
的类型的扩展返回。 Bind 包含一组用于许多 UIKit 类的 Bindable
扩展,以便 Output
可以直接绑定到这些类。自定义类可以类似地扩展以符合 Bindable
和 BindableCompatible
。在我们的架构中,View Model 中的 Output
通常从 View Controller 的 viewDidLoad 方法绑定到 View 的 BindableCompatible
元素。
Relay
是 Output
的一个特殊子类,对于启动响应式事件链很有用。它是一个不存储任何值的 Output
,但当其 fire
方法被调用时,将调用任何存储的闭包。
Subscription
和 SubscriptionContainer
提供了一种机制,用于从 Output
解绑闭包,并且在使用可重用元素(如 TableView 单元格)时非常有用。
Bind 还包含一些函数式扩展,允许以各种方式转换 Output
combine
将两个类型分别为 A 和 B 的 Output
合并为一个新的类型为 (A, B) 的 Output
,每当其中一个更新且另一个有值时,该 Output
就会更新。
merge
接受两个相同类型的 Output
,并创建一个新的该类型的 Output,每当其中一个更新时,该 Output 就会更新。
map
对一个 Value 执行转换,并将其作为 TransformedValue
包装在其自己的 Output
中返回。transform
属性是将 Value
转换为 TransformedValue
的函数,map
返回类型为 TransformedValue
的 Output
flatMap
对一个 Value 执行转换,并通过展平嵌套的 Outputs 将其作为类型为 TransformedValue
的 Output
返回。transform
属性是将 Value
转换为一个新的类型为 TransformedValue
的 Output
的函数,flatmap
返回一个展平的类型为 TransformedValue
的 Output