使用 RxSwift 更快地编写代码

原文:Code faster with RxSwift

人们通常谈论反应式编程,特别是 RxSwift,认为它是描述应用程序逻辑的终极方式 -- 事件链、错误处理、异步。但不要忘了,RxSwift 本身也是一种工具,可以让你为任何东西添加反应式扩展。

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

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

RxKeyboard

我们都喜欢用键盘重叠密码字段,不是吗?

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

swift 复制代码
RxKeyboard.instance.isHidden
  .drive(backgroundFadeView.rx.isHidden)
  .disposed(by: disposeBag)

我可以解释一下,当键盘隐藏时,我会隐藏 backgroundFadeView;当键盘可见时,我会显示 backgroundFadeView。虽然你一眼就看明白了。

RxGesture

UIButton 不够用时,这种情况非常常见。让我们比较一下语法:

swift 复制代码
...

我可以再次解释,我们只过滤 .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

参考:

相关推荐
Swift社区9 小时前
Apple 新品发布会亮点有哪些 | Swift 周报 issue 61
ios·swiftui·swift
营赢盈英3 天前
OpenAI GPT-3 API error: “You must provide a model parameter“
chatgpt·gpt-3·openai·swift
一只不会编程的猫3 天前
高德地图绘图,点标记,并计算中心点
开发语言·ios·swift
loongloongz3 天前
Swift语言基础教程、Swift练手小项目、Swift知识点实例化学习
开发语言·学习·swift
2401_858120537 天前
深入理解 Swift 中的隐式解包可选类型(Implicitly Unwrapped Optionals)
开发语言·ios·swift
quaer7 天前
QT chart案例
开发语言·qt·swift
安和昂8 天前
【iOS】UIViewController的生命周期
ios·xcode·swift
00圈圈8 天前
Swift 创建扩展(Extension)
ios·swift·extension
2401_858120538 天前
Swift 中的函数:定义、使用与实践指南
开发语言·ssh·swift
quaer9 天前
VS+QT--实现二进制和十进制的转换(含分数部分)
java·开发语言·python·qt·swift