RxSwift + MVVM,一次一点

我很幸运能够参加尝试! Swift Swift纽约今年,我观看了许多有趣的演讲。 我最喜欢的是Paul Fenwick对机器伦理的预测,以及Carl Brown对Swift中常见错误的有趣分析。 我强烈建议您关注这些家伙,听听他们的意见。 但是,确实发生了两件事情,这使我对新思想产生了开放的想法,从而导致了我日常工作中急需的改变。 第一个是Ash Furrow主持的RxSwift研讨会,第二个是Nataliya Patsovska的MVVM演讲。 本文假定您具有响应式和函数式编程的一些基本知识,但希望所有开发人员都可以一定程度地访问它们。

每天,我在Match的BLK应用程序上工作,在该应用程序中,我使用RxSwift的几率极低。 直到最近,我的使用仍主要限于网络代码和模型转换。 我知道我没有充分利用框架的潜力,但是由于某种原因,我仍然故意不了解一些我现在认为使其真正强大的核心功能。 Ash帮助我发现了其中一些功能,现在我感到有能力以更具反应性的风格编写代码。 但是,在查看新代码之前,我认为查看一些旧代码对理解我的问题很重要:

这是与我的应用程序中其他序列相似的Observable序列的示例。 我几乎所有的RxSwift代码都看起来像这样。 在这里,我要从IBAction函数调用fetchUsers() ,在其中创建一个新的Observable(API请求),转换所得数据,然后在序列上调用订阅 。 为了简洁起见,此代码示例和后续代码示例中已省略一些代码。 我将其留给读者来推断(或简单地忽略)此链中某些函数的实现细节,例如mapModel(model:) 。 您可能还注意到此功能包含副作用。 具体来说,我正在显示/隐藏自定义加载视图,并重新加载表视图。 最后,我有两个“配置”和处理错误情况的功能。 这是声明式外观背后的命令式编程。

我对RxSwift还是很陌生,但是现在我已经学会了将这类订阅视为一种代码味道。 让我们从列举此代码的潜在问题开始:

  1. 函数fetchUsers()势在必行。 每次要获取用户时,IBAction必须调用此函数。 如果将按钮轻击表示为事件的可观察流,那么将此流绑定到获取程序会更好吗?
  2. 可观察对象具有一个内置函数,用于处理称为do的副作用。 我们可以使用此功能来显示/隐藏加载视图,但是如果此Observable序列根本不关心UI,会更好吗?
  3. 在很多情况下,在Observable上调用订阅是很有意义的,但这可能不是其中一种。 此序列的最终目的不是执行某些副作用,而是获得一个具体的模型:一组用户。 将此Observable 绑定到需要数据的Observer有意义吗?

Interesting Posts