文章

IOS Redux核心原理理解

一.Redux 核心原理(状态管理)

1. 单一数据源(Single Source of Truth)

所有的应用状态都被放在一个“全局的 Store”(状态存储对象)里,形成应用的唯一真相来源,避免状态分散、难以管理。

2. 状态只读(State is Read-only)

状态不能被直接更改,必须通过分发(dispatch)Action(动作)来进行。

3. 使用纯函数“Reducer”更新状态

每当有 Action 被分发,都会由 Reducer(纯函数)根据当前 State 和 Action 计算并返回新的 State。


二.核心组成

  • Store:全局唯一的状态容器,管理应用状态和变更。

  • State:应用的所有数据(一般用 struct)。

  • Action:描述发生了什么的“动作”,一般用枚举 enum。

  • Reducer:纯函数,负责“旧状态+动作=新状态”。

  • Middleware(可选):中间件,用于处理异步任务、副作用、日志等拦截流程。


三.iOS Swift 示例(简易版)

假设我们有一个“蓝牙连接”页面:

// 1. State
struct BLEState {
    var isConnected: Bool
    var deviceName: String?
}

// 2. Action
enum BLEAction {
    case connect(device: String)
    case disconnect
}

// 3. Reducer
func bleReducer(state: BLEState, action: BLEAction) -> BLEState {
    var newState = state
    switch action {
    case .connect(let name):
        newState.isConnected = true
        newState.deviceName = name
    case .disconnect:
        newState.isConnected = false
        newState.deviceName = nil
    }
    return newState
}

// 4. Store(极简版,不带订阅器)
class BLEStore {
    private(set) var state: BLEState
    init(initialState: BLEState) { self.state = initialState }
    func dispatch(action: BLEAction) {
        state = bleReducer(state: state, action: action)
    }
}

使用示例

let store = BLEStore(initialState: BLEState(isConnected: false, deviceName: nil))

store.dispatch(action: .connect(device: "AirPods"))
print(store.state) // isConnected = true, deviceName = "AirPods"

store.dispatch(action: .disconnect)
print(store.state) // isConnected = false, deviceName = nil

四.核心优势

  • 解耦:ViewController不直接持有各自状态,“全局同步”更清晰。

  • 可预测性强:所有的状态变更都被 Action 驱动,每次变更可复制、可追踪。

  • 易于调试和测试:Reducer是纯函数,便于单元测试。


五.Redux 在 iOS 的实际生态

  • 常用库:ReSwift(Swift版Redux),SwiftRex

  • 一般与MVVM或SwiftUI结合较多,用于复杂模块或多端共用业务逻辑场景。


使用口诀

  1. 只用 Store 存全局数据

  2. 所有请求都走 Action(动作)

  3. 所有改动都让 Reducer(函数)来做决定

你的这个问题非常重要,也是很多跨平台开发者经常关心的点。

六.iOS 中的 Redux 和前端 Redux 是否一样?

核心思想上是一样的,但实现机制和生态有很多区别。


相同点

  1. 设计理念一致
    iOS 和前端(特别是 React/Redux)中的 Redux 都遵循同样的状态管理三个核心原则:

  • 单一数据源(Single source of truth)

  • 状态只读(State is read-only,变更只能通过 Action 发起)

  • 用纯函数“Reducer”更新状态(State changes by pure functions)

  1. 核心流程一致

  • Action(动作/事件)

  • Reducer(纯函数处理状态变更)

  • Store(全局状态管理中心)


主要区别

  1. 实现方式不同

  • 前端 Redux:有官方标准 redux 库,配合 React、React Native 使用,生态体系完整,且数据流多为“响应式订阅”。

  • iOS Redux:没有苹果官方 Redux 库,社区实现有 ReSwiftSwiftRex 等,通常是受前端 Redux 思想启发开发的第三方库。

  1. 适用场景差异

  • 前端 Redux:常用于组件树庞大、数据流复杂的 SPA(单页应用),尤其是 React/React Native。

  • iOS Redux:适合多页面共享复杂状态、解耦 Controller 逻辑,但 iOS 项目通常页面数量和数据流深度不如大型前端 SPA 复杂,所以实际被广泛采用的比例相比前端低。

  1. 响应式结合

  • 前端 Redux:经常用于 React 这种响应声明式 UI 框架。

  • iOS Redux:可以结合 SwiftUI 实现类似响应式,但大多数 UIKit 项目采用的是绑定、通知等手段。

  1. 中间件和副作用处理

  • 前端 Redux:如 thunk、saga 等。

  • iOS Redux:通常称作 Middleware,有自己的写法,但一般以闭包和 Combine/RxSwift 的方式实现异步。

  1. 语言和语法支持

  • 前端 Redux 一般使用 JavaScript/TypeScript。

  • iOS Redux 主要用 Swift(少部分还用 Objective-C)。


总结

  • 思想层面,iOS Redux 和前端 Redux 差不多,都是用统一 Store、不可变状态和 Action-Reducer 流程管理 App 状态。

  • 实现细节,iOS 没有官方库,API 形式、响应式绑定模型、生态地位和前端有很多区别。

许可协议:  CC BY 4.0