使用 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

参考:

相关推荐
奶糖的次元空间1 天前
iOS 学习笔记 - SwiftUI 和 简单布局
ios·swift
2501_915918413 天前
有没有Xcode 替代方案?在快蝎 IDE 中完成 iOS 开发的过程
ide·vscode·ios·个人开发·xcode·swift·敏捷流程
songgeb3 天前
Compositional layout in iOS
ios·swift·设计
1024小神4 天前
记录xcode项目swiftui配置APP加载启动图
前端·ios·swiftui·swift
wjm0410065 天前
ios学习路线-- swift基础2
学习·ios·swift
游戏开发爱好者86 天前
如何使用Instruments和Keymob进行Swift应用性能优化分析
开发语言·ios·性能优化·小程序·uni-app·iphone·swift
游戏开发爱好者87 天前
新的 iOS 开发工具体验,在快蝎 IDE 里完成应用开发与真机调试
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子7 天前
50 岁的苹果和 51 岁的我 -- 肘子的 Swift 周报 #127
人工智能·swiftui·swift
denggun123458 天前
Sendable 协议-Swift 结构化并发的核心安全保障
ios·swift
denggun123458 天前
结构化并发(Structured Concurrency)
开发语言·ios·swift