人们通常谈论反应式编程,特别是 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
)?如此重要的问题却需要大量代码。
我们有遍布整个类的代码,还有委托,以及完全无用的 numbersOfRowInSection
和 numberOfSections
方法。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
类型,而不是 onNext
、onError
必不可少的回调系统。
我最喜欢的方法是将事件序列拆分为错误序列和元素序列。使用这种方法,除非你希望,否则不会出现任何可观察事件完成或失败并伴有错误的情况。
我建议你在此处阅读更多有关使用 Materialize 处理 RxSwift 错误的信息。
RxFlow
以被动方式处理导航问题的绝佳框架。关于它的文章即将发布,如果不想错过,请关注我:)
不难看出,反应式框架结合了类似的语法和动机。人们希望在不降低可读性的前提下减少代码量。而 RxSwift 采用异步事件的工作方式,确实能让你做到这一点。你只需要一行代码,而命令式风格可能需要十行代码。
我强烈建议你浏览 RxSwiftCommunity 中的其他资源库。你会发现许多 iOS 部件的反应式扩展,以及包括单向数据流在内的多种架构。了解解决日常任务的其他方法总是非常有用的。也许它们会比你的更好?
如果你喜欢这个故事,请点赞并分享,帮助其他人找到它!欢迎在下方留言。关注我,了解更多关于 RxSwift 的信息。
RxFeedback
参考: