带RxSwift示例的FRP(#1)

如今,Reactive编程对于许多语言的开发人员世界来说并不陌生。 对于此博客,它将专注于Swift和ReactiveX公司的强度库,绝对是RxSwift,它是2年前成长的语言。 如果您已经熟悉FRP的概念,请跳到下一个示例。 关于FRP概念,请深入阅读我之前的2个博客:这个和另一个。

如果您什至没有时间阅读2个我的博客,则以下是一个简短的FRP:

甚至在Swift宣布之前,功能性反应式编程(FRP)与面向对象的编程相比,近年来已获得了极大的普及。 从Haskell到Java语言,您将找到FRP启发的实现。 为什么是这样? 玻璃钢有什么特别之处? 也许最重要的是,如何在Swift中利用这种范例?

“功能性反应式编程”是由Conal Elliott创建的编程范例。 他的定义具有非常具体的语义,欢迎您在这里进行探索。 对于更宽松/简单的定义,功能性反应式编程是其他两个概念的组合:

响应式编程 ,其重点是异步数据流,您可以侦听并相应地做出反应。 要了解更多信息,请查看此出色的介绍。

函数式编程 ,它强调通过数学风格的函数进行计算,不变性和表达性,并最大程度地减少了变量和状态的使用。 要了解更多信息,请查看我们的Swift函数式编程教程。

一个例子

值得说明的一个例子表明FRP的效果就像在UITableView和UISearchBar之间组合搜索某物。 首先,我们需要一个podfile来获取所有和您的依赖项:

要完成,我们有以下这些东西:

接下来,UI将如下所示:

这是准备工作,现在让我们编写代码。 假设您想在您的城市中找到一个或多个IT公司。 尽可能多地创建一个虚拟公司。 同样,您可以制作一个API来响应有价值的数据,但是请避免这样做,因为我们不需要而且从不专注于此,因此会花费很多时间。 虚拟数据,例如:

  var foundCompanies = [String]() 
 让companyDummy = [“ Apple Inc”,“ Microsoft Co。”,“ Nokia”,“ Yahoo”,“ Snapchat”,“ Twitter”,“ Facebook”,“ Google”,“ Bings”,“ FPT软件”,“ Framgia”] 

开始了! 然后,我们将设置扩展表视图的数据源,如下所示:

  • 拖放tableview,searchBar引用:
  @IBOutlet弱var searchBar:UISearchBar! 
@IBOutlet弱var tableView:UITableView!
  • 扩展以实现数据源:
 扩展ViewController:UITableViewDataSource { 
  func tableView(tableView:UITableView,numberOfRowsInSection部分:Int)-> Int { 
返回foundCompanies.count
}
  func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell { 
let cell = tableView.dequeueReusableCellWithIdentifier(“ companyCell”,forIndexPath:indexPath)
cell.textLabel?.text = foundCompanies [indexPath.row]
 返回单元 
  } 
  } 

编译并运行,此应用程序什么也不显示。 是的,它的方法正确。 按照传统方式,我们通常会这样做。 始终显示结果的步骤是:

  • 符合搜索栏委托,当用户按下任何内容时,将为委托赋予指定的字符并属于委托功能
  • 您得到了它,并使用循环和if-else条件遍历整个元素,并过滤了匹配的结果并显示在屏幕上。

→它在您的项目中编写了大量代码,并且在每个代码上都编写了复杂的逻辑。 简单地说,我们将使用Rx:

 搜索栏 
1 .rx_text
2 .throttle(1.0,Scheduler:MainScheduler.instance)
3 .distinctUntilChanged()
4 .filter {$ 0.characters.count> 0}
5 .subscribeNext {[unown self](com)in
self.foundCompanies = self.companiesDummy.filter {$ 0.hasPrefix(com)}
self.tableView.reloadData()
}
6 .addDisposableTo(disposeBag)

好吧,看起来很有趣吧? 我们将逐步介绍上面的代码片段。

  • #1向我们展示了搜索栏UI的属性,该属性受RxCocoa(是RxSwift的扩展)支持。 一旦搜索栏中的文本更改,它就会发出 信号 。 实际上,我们正在观察搜索栏中的文本。
  • #2 :节流阀()对指定的调度程序产生延迟效果。 这意味着请求将在1秒后发送。 当用户很快输入相同字符时,是为了避免相同的发送请求。 为此,如果没有Rx,我们将添加一些标志搜索查询,并将其与新查询进行比较,这会使我们发疯。
  • #3 :distinctUntilChanged()保护我们免受相同的值的侵害。
  • #4 :过滤器是为了避免发送空请求,无论用户是否输入空字符。
  • #5 :subscribeNext可能是很容易理解的-我们正在订阅 observable 属性 ,该属性会产生信号 。 它会向您显示所有新内容。 在我们的例子中,我们只需要新值,但是subscription具有更多包装器,这些包装器具有onErroronCompleted等事件。
  • #6 :addDisposableTo,这非常重要,当您订阅 Observable时,您需要取消订阅以避免保留周期。 所以我们必须调用DisposeBag 通常用于保留您要在deinit()进程中退订的所有内容。

做得好,我们完成了编码活动,并有时间运行并看到了很酷的东西。

结论

上面的示例展示了Rx的优势,最重要的是控制您在Reactive中的大脑思维,就像Github Gist上共享的staltz一样:

学习过程中最困难的部分是“反应式”思维。 放开传统编程中古老的命令式和有状态的习惯,并迫使您的大脑在不同的范式下工作,这与很多事情有关。 在这方面,我还没有在互联网上找到任何指南,我认为世界上应该有一个有关如何在Reactive中进行思考的实用教程,以便您可以开始使用。 之后,图书馆文档可为您提供方便。 我希望这可以帮助你。

但是,比较简单和容易之间,我想您的选择很简单。 对于其他将阅读您的项目,对其进行维护,在其上写CI / CD的人来说,这很简单。 如果可以的话,让我们最简单地帮助他们。

对于下一个博客,我将向您展示如何制作可观察的对象和绑定。 例如,也许将MVVM模式+ RxSwift组合在一起。 现在,我认为该博客足以让您通过代码熟悉Rx。

您可以在此处下载完成的项目。 如果您对Rx还能做什么感到好奇,请查看ReactiveX的文档。

希望您喜欢RxSwift的介绍。 如果您有任何疑问,意见或反馈,请留在下面。

和平✌