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

参考:

相关推荐
良技漫谈2 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
KeithTsui2 天前
ZFC in LEAN 之 前集的等价关系(Equivalence on Pre-set)详解
开发语言·其他·算法·binder·swift
袁代码2 天前
Swift 开发教程系列 - 第4章:函数与闭包
ios·swift·ios开发
安泽13143 天前
高德地图美食
开发语言·swift·美食
袁代码4 天前
Swift 开发教程系列 - 第2章:Swift 基础语法
swift·ios开发·基础教程
袁代码4 天前
Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置
swift·ios开发·基础教程
孚亭4 天前
一些swift问题
swift
莫问alicia4 天前
echarts 实现3D饼状图 加 label标签显示
前端·3d·echarts·swift
uiop_uiop_uiop6 天前
iOS Swift5算法恢复——HMAC
ios·iphone·swift
東三城8 天前
【ios】---SwiftUI开发从入门到放弃
ios·swiftui·swift·1024程序员节