# RxSwift 深度训练:100道进阶练习题

48 阅读8分钟

RxSwift 深度训练:100道进阶练习题

本文包含精心设计的100道RxSwift练习题,覆盖从基础概念到架构设计的核心知识点。题目难度阶梯式上升,每道题都标注了学习重点,建议配合Playground实践。

目录


一、基础概念与创建(1-20)

  1. 创建发出整数1、2、3后完成的Observable
    📌 学习:Observable.create 手动构建序列

  2. 使用just操作符创建发出单个字符串"Hello"的Observable
    📌 掌握基础创建操作符

  3. 将数组[10, 20, 30]转换为Observable序列
    📌 学习:Observable.from 转换集合

  4. 创建间隔1秒发出递增整数的Observable
    📌 掌握:Observable.interval 时间序列

  5. 实现冷Observable:每次订阅都重新发射数据
    📌 理解冷热Observable的核心差异

  6. 使用deferred创建动态生成Observable的工厂
    📌 掌握延迟初始化技巧

  7. 组合rangemap生成前5个偶数的平方序列
    📌 操作符链式调用实践

  8. 创建重复3次"Rx"的Observable
    📌 学习:repeatElement + take

  9. 实现空Observable和永不终止的Observable
    📌 掌握:empty()never()

  10. 创建立即终止的错误Observable(NSError类型)
    📌 错误处理基础:Observable.error()

  11. startWith在序列开头插入初始值0
    📌 学习事件序列组合

  12. 连接两个Observable([1,2] + [3,4])
    📌 掌握:concat 顺序拼接

  13. 合并两个时间交错的Observable
    📌 理解:merge 的并行特性

  14. 配对两个Observable的发射事件
    📌 严格事件对齐:zip 操作符

  15. 实现实时计算器(两个输入框数值相加)
    📌 实战:combineLatest 状态组合

  16. 在两个Observable中选择第一个响应的
    📌 竞态处理:amb 操作符

  17. 管理多个动态切换的请求
    📌 高级技巧:switchLatest 应用

  18. 计算1-10的累加和
    📌 聚合操作:reduce

  19. 实现每一步都输出累加结果的序列
    📌 状态跟踪:scan 操作符

  20. 创建带自定义Disposable资源的Observable
    📌 核心:资源生命周期管理

⬆️ 返回目录


二、操作符应用(21-40)

  1. 筛选大于100的整数
    📌 基础过滤:filter

  2. 过滤连续重复值
    📌 高效去重:distinctUntilChanged

  3. 仅获取前两个事件
    📌 流量控制:take(2)

  4. 跳过首个元素
    📌 序列裁剪:skip(1)

  5. 获取序列第3个元素
    📌 精准定位:elementAt

  6. 实现搜索框防抖(延迟0.3秒)
    📌 UI优化核心:debounce

  7. 控制按钮点击频率(1秒内只响应一次)
    📌 防暴击:throttle

  8. 设置网络请求超时(3秒)
    📌 健壮性保障:timeout

  9. 替换错误为默认值
    📌 优雅降级:catchError

  10. 实现网络请求失败自动重试(最多3次)
    📌 容错机制:retry

  11. 将Int转换为String
    📌 数据转换:map

  12. 将每个ID转换为网络请求
    📌 嵌套处理:flatMap

  13. 实现搜索关键词自动切换
    📌 最新事件优先:flatMapLatest

  14. 保证请求按发起顺序完成
    📌 顺序控制:flatMapFirst

  15. 保证内部Observable顺序执行
    📌 串行队列:concatMap

  16. 将事件转换为Event对象
    📌 元事件处理:materialize

  17. 将事件分组成3秒一批的Observable
    📌 时间窗口:window

  18. 按奇偶数分组处理
    📌 数据分组:groupBy

  19. 将整个序列转为单数组事件
    📌 聚合结果:toArray

  20. 实现带日志调试的map操作符
    📌 自定义操作符开发

⬆️ 返回目录


三、Subject与Relay(41-50)

  1. 广播事件给多个订阅者
    📌 消息总线:PublishSubject

  2. 验证新订阅获取最新值
    📌 状态保持:BehaviorSubject

  3. 缓存最近2个事件
    📌 历史回放:ReplaySubject

  4. 只发送最终结果
    📌 单结果流:AsyncSubject

  5. 实现状态管理(当前登录用户)
    📌 响应式状态:BehaviorRelay

  6. 替换不能发送完成的Subject
    📌 无终止流:PublishRelay

  7. 将传统回调转换为Observable
    📌 桥接旧代码:Subject包装模式

  8. 实现双向数据绑定
    📌 MVVM核心:Subject绑定技巧

  9. 组合Subject和操作符实现事件总线
    📌 全局通信方案设计

  10. Relay与Subject的内存管理对比
    📌 避免循环引用实践

⬆️ 返回目录


四、线程调度(51-60)

  1. 指定数据产生线程(后台)
    📌 源头控制:subscribeOn

  2. 指定事件消费线程(主线程)
    📌 UI安全:observeOn

  3. 实现"后台处理+主线程更新"
    📌 经典组合:subscribeOn + observeOn

  4. 测试并发队列调度器
    📌 并行处理:ConcurrentDispatchQueueScheduler

  5. 保证顺序执行
    📌 串行队列:SerialDispatchQueueScheduler

  6. 封装NSOperation
    📌 任务调度:OperationQueueScheduler

  7. 驱动UI更新
    📌 主线程守护:MainScheduler.instance

  8. 使用observeOn避免资源竞争
    📌 线程安全实践

  9. 追踪线程切换路径
    📌 调试技巧:debug()操作符

  10. 避免不必要的线程切换
    📌 性能优化核心

⬆️ 返回目录


五、UI绑定实践(61-75)

  1. 绑定UITextField文本到UILabel
    📌 RxCocoa基础:bind(to:)

  2. 按钮点击计数功能
    📌 UI交互:rx.tap 处理

  3. UISwitch与ViewModel双向绑定
    📌 控件状态管理

  4. 防止按钮重复点击
    📌 交互优化:throttle 实战

  5. 绑定数据源到UITableView
    📌 核心:rx.items(cellIdentifier:)

  6. 捕获UITableViewCell点击事件
    📌 事件传递:rx.modelSelected

  7. 监听滚动到底部事件
    📌 分页加载基础:rx.contentOffset

  8. 验证登录按钮状态
    📌 条件组合:combineLatest

  9. 实现实时搜索功能
    📌 经典模式:debounce + flatMapLatest

  10. 用Driver替代Observable绑定UI
    📌 学习:Driver的零错误/主线程特性

  11. 实现自定义控件绑定
    📌 扩展:ControlProperty 封装

  12. 绑定UIGestureRecognizer
    📌 手势响应式处理

  13. 实现倒计时器
    📌 时间转换:map + interval

  14. 替换addTarget传统方式
    📌 响应式改造范例

  15. 在UI中安全显示网络错误
    📌 错误传递策略

⬆️ 返回目录


六、网络与数据(76-85)

  1. 封装URLSession为Observable
    📌 基础网络层设计

  2. 使用RxAlamofire发起GET请求
    📌 主流库集成

  3. 并行请求多个接口
    📌 数据聚合:zip 实战

  4. 先登录后获取用户信息
    📌 链式请求:flatMap 嵌套

  5. 请求失败显示重试对话框
    📌 交互式错误恢复

  6. 实现指数退避重试策略
    📌 高级重试:retryWhen

  7. 管理多个请求加载状态
    📌 统一加载器:activityIndicator

  8. 本地优先+网络更新策略
    📌 缓存设计模式

  9. 分页加载实现
    📌 经典:page + limit 参数处理

  10. 安全处理JSON解析错误
    📌 数据容错:map + catchError

⬆️ 返回目录


七、高级模式(86-100)

  1. scan实现状态机
    📌 状态流转管理

  2. 将Service作为Observable依赖
    📌 响应式依赖注入

  3. 实现可取消的异步任务
    📌 生命周期:takeUntil

  4. 避免循环引用
    📌 内存安全:withUnretained

  5. 使用RxTest控制虚拟时间
    📌 单元测试进阶

  6. 添加DisposeBag日志
    📌 内存泄漏检测

  7. 自定义双向绑定操作符(<->
    📌 语法糖设计

  8. 共享网络请求结果
    📌 资源复用:share(replay: 1)

  9. 多模块通信(NotificationCenter转Rx)
    📌 跨模块解耦

  10. 协调多个异步操作
    📌 竞态条件处理

  11. 动态调整Observable链
    📌 运行时操作符替换

  12. 插入调试逻辑
    📌 诊断工具:do 操作符

  13. 重写Delegate为Observable
    📌 协议转换技巧

  14. 管理复杂表单状态
    📌 高级组合:combineLatest 深层应用

  15. 实现Redux-like架构
    📌 全应用状态管理

⬆️ 返回目录


附加题(101-110)

  1. 自定义CLLocationManager的Rx扩展
    📌 系统框架响应式改造

  2. 封装WebSocket通信
    📌 实时数据流处理

  3. 使用RxDataSources处理多分区TableView
    📌 复杂列表解决方案

  4. CoreData的RxCRUD操作封装
    📌 持久层响应式适配

  5. 协调动画序列
    📌 UI动画的高级控制

  6. 实现自动重连的心跳机制
    📌 长连接稳定性设计

  7. 控制并发请求数量
    📌 资源限制:window + flatMap

  8. RxSwift与ReactiveSwift交互
    📌 跨响应式框架协同

  9. 减少不必要的事件发射
    📌 性能优化:条件过滤

  10. 提前加载下一页数据
    📌 用户体验优化:预加载策略