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

参考:

相关推荐
打工人你好7 小时前
Swift 的 KeyPath 是什么?
swift
struggle202516 小时前
Ollmao (OH-luh-毛程序包及源码) 是一款原生 SwiftUI 应用程序,它与 Ollama 集成,可在 Mac 上本地运行强大的 AI 模型
ios·swiftui·swift
神仙别闹3 天前
基于Swift实现拼图游戏
开发语言·搜索引擎·swift
神仙别闹4 天前
基于Swift实现仿IOS闹钟
ios·cocoa·swift
ctf_02268 天前
echarts 3d中国地图飞行线
3d·echarts·swift
没头脑的ht8 天前
UITableView的复用原理
ios·swift
自不量力的A同学10 天前
苹果公司宣布正式开源 Xcode 引擎 Swift Build145
swift
SchneeDuan11 天前
iOS--SDWebImage源码解析
ios·缓存·swift·第三方库·sdwebimage
leluckys12 天前
swift 专题三 swift 规范一
开发语言·ios·swift
Unlimitedz13 天前
封装常用控制器
ios·swift