原文:Code faster with RxSwift

人们通常议论反应式编程,特别是 RxSwift,以为它是描绘运用程序逻辑的终极方式 — 事情链、过错处理、异步。但不要忘了,RxSwift 自身也是一种东西,能够让你为任何东西增加反应式扩展。

RxSwift 具有一个庞大而赋有创造力的社区。RxSwiftCommunity 的 github 存储库中目前有 55 个不同规划和用途的存储库。它们的根源都是反应式编程。

运用 RxSwift 更快地编写代码

下面我将谈谈我的 Podfile 中必备的依赖项。

RxKeyboard

咱们都喜爱用键盘重叠暗码字段,不是吗?

我不想数代码行数,也不想描绘我对运用 NotificationCenter 的有多么反感。只需看看通过事情序列的概念来表达键盘高度的变化是多么酷。让我提醒你,这里供给了一切 Rx 操作符。你能够在这里运用debounce,或与另一个 Observable 结合运用,等等。下面是我最喜爱的声明式代码示例:

RxKeyboard.instance.isHidden
  .drive(backgroundFadeView.rx.isHidden)
  .disposed(by: disposeBag)

我能够解释一下,当键盘躲藏时,我会躲藏 backgroundFadeView;当键盘可见时,我会显示 backgroundFadeView。尽管你一眼就看明白了。

RxGesture

UIButton 不够用时,这种状况十分常见。让咱们比较一下语法:

...

我能够再次解释,咱们只过滤 .ended 手势并核算翻译。但即便你不熟悉这个结构或 RxSwift,这也是显而易见的。

这种旧式 Cocoa 形式的问题在于,一切类中的代码都很涣散。要想知道视图发生了什么,你有必要翻遍整个类,找到实际上应该会集在一处的代码。你需求:

  • 回调函数
  • 创立 GestureRecognizer
  • 装备它(设置最大触摸次数 maximumNumberOfTouches);
  • 将其增加到视图;

第一项是最可怕的。该类将有一个函数传递给 #selector()。这是一个真实的函数吗?不是,这是一个无缘无故起了姓名的回调函数。这个函数有必要是匿名的(例如闭包),以约束开发人员手动调用它。

类似 setupGestureRecognizer 这样的 util 函数也存在相同的问题,由于组件的设置代码就放在这里。这些函数并不是真实意义上的函数。它们并不表达类的行为。咱们只需求以某种方式将代码分隔 “以进步其可读性”。与此同时,类的规划增大了,意义也变得不那么明晰了,真实的业务逻辑也变得复杂难懂了。

有了 RxGesture,你的一切代码(创立、装备、回调)都会集在一处。你能够快速查看并修改它们。没有任何无意义的有用函数是徒劳地企图保持代码分离的成果。

RxDataSources

最简洁的部分 怎么处理每个 iOS 开发人员生命中最重要的东西(UITableView / UICollectionView)?如此重要的问题却需求大量代码。

咱们有遍布整个类的代码,还有托付,以及彻底无用的 numbersOfRowInSectionnumberOfSections 办法。section 应该用语言东西来表达,例如,通用结构 SectionModel <String, Int>,它需求一个 section 的称号和一个 section 元素数组。现在,能够隐式地推断出 section 和 cell 的数量。数组的长度总是等于 section 的个数,嵌套数组的长度等于 section 中 cell 的个数。

而且也不需求通过 IndexPath 来触摸数组中的 item。保持简略。下面的闭包 configureCell 将模型作为参数。程序员只需从中创立一个单元格即可。

还有一个额外的奖赏 –diff 算法,其作业复杂度为 O(N)。咱们将在下一篇文章中详细介绍。只需发射一个新的部分数组,结构就会只更新需求的地方。不再需求调用 reloadData。此外,还支撑开箱即用的动画更新和便利的闭包,而不是过期的托付。对我来说,在 collectionView 中运用页脚活动指示器从未如此便利。

RxSwiftExt

RxSwift 完结了 reactiveX.io 规范,但对新想法并不十分隔放。但这并不妨碍社区的开展,因此有了自定义操作符库。它们都十分小巧简略,但却能协助我避免每天编写几十行代码。

假如你已经有了运用 Rx 的经验,你或许会对最佳过错处理实践感兴趣。有人会主张运用 Railway 形式和 Result 类型,而不是 onNextonError 必不可少的回调系统。

我最喜爱的办法是将事情序列拆分为过错序列和元素序列。运用这种办法,除非你期望,不然不会呈现任何可观察事情完结或失败并伴有过错的状况。

我主张你在此处阅览更多有关运用 Materialize 处理 RxSwift 过错的信息

RxFlow

以被迫方式处理导航问题的绝佳结构。关于它的文章即将发布,假如不想错过,请重视我:)

不难看出,反应式结构结合了类似的语法和动机。人们期望在不下降可读性的前提下减少代码量。而 RxSwift 选用异步事情的作业方式,的确能让你做到这一点。你只需求一行代码,而命令式风格或许需求十行代码。

我强烈主张你浏览 RxSwiftCommunity 中的其他资源库。你会发现许多 iOS 部件的反应式扩展,以及包括单向数据流在内的多种架构。了解解决日常使命的其他办法总是十分有用的。或许它们会比你的更好?

假如你喜爱这个故事,请点赞并共享,协助其他人找到它!欢迎在下方留言。重视我,了解更多关于 RxSwift 的信息。

RxFeedback

参阅: