RxSwift 深度训练:100道进阶练习题
本文包含精心设计的100道RxSwift练习题,覆盖从基础概念到架构设计的核心知识点。题目难度阶梯式上升,每道题都标注了学习重点,建议配合Playground实践。
目录
- 一、基础概念与创建(1-20)
- 二、操作符应用(21-40)
- 三、Subject与Relay(41-50)
- 四、线程调度(51-60)
- 五、UI绑定实践(61-75)
- 六、网络与数据(76-85)
- 七、高级模式(86-100)
- 附加题(101-110)
一、基础概念与创建(1-20)
-
创建发出整数1、2、3后完成的Observable
📌 学习:Observable.create手动构建序列 -
使用
just操作符创建发出单个字符串"Hello"的Observable
📌 掌握基础创建操作符 -
将数组[10, 20, 30]转换为Observable序列
📌 学习:Observable.from转换集合 -
创建间隔1秒发出递增整数的Observable
📌 掌握:Observable.interval时间序列 -
实现冷Observable:每次订阅都重新发射数据
📌 理解冷热Observable的核心差异 -
使用
deferred创建动态生成Observable的工厂
📌 掌握延迟初始化技巧 -
组合
range和map生成前5个偶数的平方序列
📌 操作符链式调用实践 -
创建重复3次"Rx"的Observable
📌 学习:repeatElement+take -
实现空Observable和永不终止的Observable
📌 掌握:empty()与never() -
创建立即终止的错误Observable(NSError类型)
📌 错误处理基础:Observable.error() -
用
startWith在序列开头插入初始值0
📌 学习事件序列组合 -
连接两个Observable([1,2] + [3,4])
📌 掌握:concat顺序拼接 -
合并两个时间交错的Observable
📌 理解:merge的并行特性 -
配对两个Observable的发射事件
📌 严格事件对齐:zip操作符 -
实现实时计算器(两个输入框数值相加)
📌 实战:combineLatest状态组合 -
在两个Observable中选择第一个响应的
📌 竞态处理:amb操作符 -
管理多个动态切换的请求
📌 高级技巧:switchLatest应用 -
计算1-10的累加和
📌 聚合操作:reduce -
实现每一步都输出累加结果的序列
📌 状态跟踪:scan操作符 -
创建带自定义Disposable资源的Observable
📌 核心:资源生命周期管理
二、操作符应用(21-40)
-
筛选大于100的整数
📌 基础过滤:filter -
过滤连续重复值
📌 高效去重:distinctUntilChanged -
仅获取前两个事件
📌 流量控制:take(2) -
跳过首个元素
📌 序列裁剪:skip(1) -
获取序列第3个元素
📌 精准定位:elementAt -
实现搜索框防抖(延迟0.3秒)
📌 UI优化核心:debounce -
控制按钮点击频率(1秒内只响应一次)
📌 防暴击:throttle -
设置网络请求超时(3秒)
📌 健壮性保障:timeout -
替换错误为默认值
📌 优雅降级:catchError -
实现网络请求失败自动重试(最多3次)
📌 容错机制:retry -
将Int转换为String
📌 数据转换:map -
将每个ID转换为网络请求
📌 嵌套处理:flatMap -
实现搜索关键词自动切换
📌 最新事件优先:flatMapLatest -
保证请求按发起顺序完成
📌 顺序控制:flatMapFirst -
保证内部Observable顺序执行
📌 串行队列:concatMap -
将事件转换为Event对象
📌 元事件处理:materialize -
将事件分组成3秒一批的Observable
📌 时间窗口:window -
按奇偶数分组处理
📌 数据分组:groupBy -
将整个序列转为单数组事件
📌 聚合结果:toArray -
实现带日志调试的map操作符
📌 自定义操作符开发
三、Subject与Relay(41-50)
-
广播事件给多个订阅者
📌 消息总线:PublishSubject -
验证新订阅获取最新值
📌 状态保持:BehaviorSubject -
缓存最近2个事件
📌 历史回放:ReplaySubject -
只发送最终结果
📌 单结果流:AsyncSubject -
实现状态管理(当前登录用户)
📌 响应式状态:BehaviorRelay -
替换不能发送完成的Subject
📌 无终止流:PublishRelay -
将传统回调转换为Observable
📌 桥接旧代码:Subject包装模式 -
实现双向数据绑定
📌 MVVM核心:Subject绑定技巧 -
组合Subject和操作符实现事件总线
📌 全局通信方案设计 -
Relay与Subject的内存管理对比
📌 避免循环引用实践
四、线程调度(51-60)
-
指定数据产生线程(后台)
📌 源头控制:subscribeOn -
指定事件消费线程(主线程)
📌 UI安全:observeOn -
实现"后台处理+主线程更新"
📌 经典组合:subscribeOn+observeOn -
测试并发队列调度器
📌 并行处理:ConcurrentDispatchQueueScheduler -
保证顺序执行
📌 串行队列:SerialDispatchQueueScheduler -
封装NSOperation
📌 任务调度:OperationQueueScheduler -
驱动UI更新
📌 主线程守护:MainScheduler.instance -
使用
observeOn避免资源竞争
📌 线程安全实践 -
追踪线程切换路径
📌 调试技巧:debug()操作符 -
避免不必要的线程切换
📌 性能优化核心
五、UI绑定实践(61-75)
-
绑定UITextField文本到UILabel
📌 RxCocoa基础:bind(to:) -
按钮点击计数功能
📌 UI交互:rx.tap处理 -
UISwitch与ViewModel双向绑定
📌 控件状态管理 -
防止按钮重复点击
📌 交互优化:throttle实战 -
绑定数据源到UITableView
📌 核心:rx.items(cellIdentifier:) -
捕获UITableViewCell点击事件
📌 事件传递:rx.modelSelected -
监听滚动到底部事件
📌 分页加载基础:rx.contentOffset -
验证登录按钮状态
📌 条件组合:combineLatest -
实现实时搜索功能
📌 经典模式:debounce+flatMapLatest -
用Driver替代Observable绑定UI
📌 学习:Driver的零错误/主线程特性 -
实现自定义控件绑定
📌 扩展:ControlProperty封装 -
绑定UIGestureRecognizer
📌 手势响应式处理 -
实现倒计时器
📌 时间转换:map+interval -
替换addTarget传统方式
📌 响应式改造范例 -
在UI中安全显示网络错误
📌 错误传递策略
六、网络与数据(76-85)
-
封装URLSession为Observable
📌 基础网络层设计 -
使用RxAlamofire发起GET请求
📌 主流库集成 -
并行请求多个接口
📌 数据聚合:zip实战 -
先登录后获取用户信息
📌 链式请求:flatMap嵌套 -
请求失败显示重试对话框
📌 交互式错误恢复 -
实现指数退避重试策略
📌 高级重试:retryWhen -
管理多个请求加载状态
📌 统一加载器:activityIndicator -
本地优先+网络更新策略
📌 缓存设计模式 -
分页加载实现
📌 经典:page+limit参数处理 -
安全处理JSON解析错误
📌 数据容错:map+catchError
七、高级模式(86-100)
-
用
scan实现状态机
📌 状态流转管理 -
将Service作为Observable依赖
📌 响应式依赖注入 -
实现可取消的异步任务
📌 生命周期:takeUntil -
避免循环引用
📌 内存安全:withUnretained -
使用RxTest控制虚拟时间
📌 单元测试进阶 -
添加
DisposeBag日志
📌 内存泄漏检测 -
自定义双向绑定操作符(
<->)
📌 语法糖设计 -
共享网络请求结果
📌 资源复用:share(replay: 1) -
多模块通信(NotificationCenter转Rx)
📌 跨模块解耦 -
协调多个异步操作
📌 竞态条件处理 -
动态调整Observable链
📌 运行时操作符替换 -
插入调试逻辑
📌 诊断工具:do操作符 -
重写Delegate为Observable
📌 协议转换技巧 -
管理复杂表单状态
📌 高级组合:combineLatest深层应用 -
实现Redux-like架构
📌 全应用状态管理
附加题(101-110)
-
自定义CLLocationManager的Rx扩展
📌 系统框架响应式改造 -
封装WebSocket通信
📌 实时数据流处理 -
使用RxDataSources处理多分区TableView
📌 复杂列表解决方案 -
CoreData的RxCRUD操作封装
📌 持久层响应式适配 -
协调动画序列
📌 UI动画的高级控制 -
实现自动重连的心跳机制
📌 长连接稳定性设计 -
控制并发请求数量
📌 资源限制:window+flatMap -
RxSwift与ReactiveSwift交互
📌 跨响应式框架协同 -
减少不必要的事件发射
📌 性能优化:条件过滤 -
提前加载下一页数据
📌 用户体验优化:预加载策略