ReactiveKit和Bond第1部分

Dr. No(我不会告诉您有关ReactiveKit的信息)

上周,我讨论了MVVM体系结构以及如何实现它的基础知识。 如果您还记得,我曾解释说,在MVVM中工作的开发人员在体系结构内工作时通常会采用反应框架。 今天,我们将快速浏览以下框架之一的一些基础知识:ReactiveKit。

ReactiveKit实际上分为两部分。 主要部分ReactiveKit本身是框架的核心。 债券是第二部分。 Bond位于ReactiveKit的顶部,并为UIKit提供反应性的“绑定”。 Bond可以单独用作管理状态更改的一种方法,或者如果您使用ReactiveKit反应性地构建内核,它提供了一种链接该内核与更多面向对象的UIKit的方法。

为了了解Bond的工作原理,让我们从他们给出的例子开始。 假设我们要在标签中立即显示用户在搜索栏中键入的任何内容。 这是我们在香草Swift中的做法:

 覆盖func viewDidLoad(){ 
super.viewDidLoad()
textField.addTarget(self,action:#selector(textChanged),for:.editingChanged)
}
  func textChanged(){ 
label.text = textField.text
}

非常简单。 但是,随着您开始添加UI元素并且视图控制器不断增长,将目标和功能全部放在代码的不同部分中可能会变得有些丑陋。 这是邦德中的样子:

 覆盖func viewDidLoad(){ 
super.viewDidLoad()
textField.reactive.text.observeNext {文本在
self.label.text =文字
}
}

凉! 一切都集中在一个地方。 很清楚,这里到底发生了什么。 更好的是,Bond包含一些不错的Swifty糖,使它更易于阅读:

  textField.reactive.text.bind(发送至:label.reactive.text) 

正如Bond文档所指出的那样,由于绑定到标签文本属性非常普遍,因此可以进一步缩短:

  textField.reactive.text.bind(收件人:标签) 

而已。 一条线。 而且我们还没有失去任何可读性。 如果有的话,我们使查看我们的代码的人更容易知道发生了什么。

现在,这里是其中的功能部分。假设我们希望标签仅以大写字母显示:

  textField.reactive.text.map {$ 0?.uppercased()}。bind(to:label) 

大多数UIKit对象都有Bond扩展。 找到它们的最简单方法是将.reactive添加到Xcode中的对象,然后查看列表中出现的内容。

因此,这里开始变得非常方便。 还记得上周我谈论MVVM的时候吗? 我谈到了如何没有完美的“开箱即用”解决方案来实现视图与视图模型和模型之间的通信。 键值观察可能很难看又笨拙。 使用委托模式会覆盖我们在MVVM的每个段之间寻求的独立性。 像Bond这样的反应性功能框架采用了KVO的最佳原则,并使其超级易用:

  viewModel.dogName.map {$ 0.uppercased()}。bind(至:标签) 

因此,现在,在视图模型中更新dogName时,标签将自动更新为新的dogName。 这就像KVO一样工作,但是没有任何凌乱的Objective-C剩菜剩饭,也不必在observeValue()函数中做出大的switch语句。

我在这里要指出,反应式编程具有一些自己的格式化约定。 例如,上面的示例通常如下所示:

  viewModel.dogName 
.map {$ 0.uppercased()}
.bind(收件人:标签)

从视觉上看,这更加清楚了。 尤其是当您开始向要绑定的属性添加功能扩展时。

假设我们建立了一个视图模型。 我们如何做到这一点,以便可以绑定视图模型的属性? 超级容易。 邦德为我们提供了一种称为“可观察”的新类型。 实际上,它充当我们要观察的原始类型属性的包装。 要声明一个可观察的属性,我们将其声明为Observable 类型,并带有一些初始值。 例如:

  struct Dog { 
var dogName:Observable = Observable(“ Maizie”)
}

Swift可以在这里推断类型,因此可以简化为:

  var dogName = Observable(“ Maizie”) 

现在可以绑定dogName了。

  dog.dogName.bind(收件人:标签) 

因此,我们有它。 ReactiveKit和Bond的基础知识。 显然,还有很多事情要做,下周我将继续讨论这个话题。 我还想进一步介绍一下这里的香肠制作方法。 实际上,这感觉像是键值观察的改进版本。 是否有替代的Swifty方式来实现KVO? (提示:有!)发表评论。 派对。