数据绑定的观察者模式的实现。

很多人可能听说过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与我联系。