数据绑定的观察者模式的实现。
很多人可能听说过RxSwift —一种功能性反应式编程(FRP)框架。 它包含与处理数据流相关的大量功能,例如转换,过滤,将一个合并到另一个以及更多。 但是,如果您的项目不需要所有功能,而您只想对某些价值的变化做出反应,那么观察者模式就是您的首选解决方案!
今天,我将向您展示此模式的实现,它的应用以及作为奖励,如何以声明方式将可观察的值绑定到UI。
观察者模式有两个主要角色:
- Publisher-产生指示值已更改的事件的对象
- 观察者-对那些事件做出反应的对象。
首先,我们将专注于发布者类型,我们将其称为Variable
。 这将是带有通用参数E
的类,该类指示观察值的类型。
我们来看一下Variable
的接口。 它已指定将初始值设置为_value
属性的初始化程序。
接下来,有两种主要方法:
-
setValue(_:)
—它将新值设置为_value
属性,并通过使用新值调用所有观察者来通知类型(E) -> Void
的所有观察者。 -
subscribe(_:)
—将新的观察者添加到观察者数组中。
现在,我们可以使用Variable
,如下所示:
在这种情况下, Publisher是一个variable
对象,而Observer是一个闭包,我们将其传递给subscribe(_:)
方法。
现在,我们的发布者类型似乎很有用,但它缺乏非常重要的功能- 价值 转换 。 为此,我们将定义map(_:)
方法。 顺便说一句,添加此方法将使Variable
成为函子! 如果您对此概念感到好奇,请参阅Wiki。
这使我们可以进行如下操作:
控制台输出:
Test
Test-transformed
奖金部分
还记得我曾经说过的,您将可以将可观察的值绑定到UI吗? 干得好!
为此,我们将定义一个Bindable
协议。
接下来,我们将添加一个自定义运算符 。 我们将其称为
bind
因为如果使用它可实现Bindable
协议,我们会将Variable
绑定到其他对象。
它只是bind(_:)
Binder
bind(_:)
方法订阅到Variable
。
让我们使UILabel符合Bindable
以启用绑定!
现在,变量绑定就像这样:
而已! 随时发表评论。 完整的源代码位于GitHub。您可以通过LinkedIn或Facebook与我联系。