有限状态机 FSM
有限状态机 Finite-state machines, 是一个非常有用的编程模式
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
我自己理解的通俗版 :
你用枚举定义几个固定的状态, 根据用户的操作或者程序执行的情况, 设置当前的状态, 再根据状态的切换执行相应的代码
最明显的, 我们 App 的生命周期就等同于一个状态机 :

前台, 后台, 可见, 被销毁, 等等状态
Demo :

-
一个列表界面, 进入列表开始发送网络请求, 刷新数据, 数据回来后渲染数据, 或者请求失败显示一个错误界面, 或者没有数据显示空白页面(比如用户没有收藏等)
-
我们可以抽取出 4 个 状态
enum { refreshing,// 正在刷新 showData, //有数据 error, // 网络等错误 noData, //无数据 }
-
然后我们进入列表界面时, 把状态设置为
refreshing
, 根据网络请求的结果设置为showData
,error
,noData
, 用户下拉刷新时再设置为refreshing
等等 -
当切换到特定状态时, 比如
refreshing
, 执行显示加载中动画的代码,
为error
时, 显示一个网络错误页面, 和一个点击重试
按钮, 等等
这样一个列表页面的各种逻辑被我们分割成几个独立清晰的 状态
, 职责明确, 代码也易于维护(其实状态多了也很蛋疼...)
通用接口
状态机在很多语言的实现略有不同, 但他们的思路都是一致的, 大概通用的接口如下 :
- 每个状态对应一个对象, 创建几个状态对象, 添加到状态机管理对象中, 并设置初始状态
- 根据用户操作等切换状态
- 状态对象的回调中做相应的处理
-
willEnterState:
,didEnterState:
-
willExitState:
,didExitState:
-
- 其它 :
- 切换到下一个状态是否合法,
isValidNextState
- 获取当前状态
- 获取所有状态
- 切换到下一个状态是否合法,
应用
有限状态机有很多实际的应用, 比如游戏开发, 编译器, JSON 解析器等
iOS 9 GameKit GKStateMachine 就是 Apple 出品的, 适用于游戏开发的状态机实现
其它好用的状态机实现 :
Objective-C 状态机 TransitionKit
Swift 状态机 SwiftState
Ref
很棒的状态机使用案例
Using State Machines to Handle Workflows
Handling iOS app states with a state machine
总结
简单的写了一个自己的状态机, iShawnWang/StateMachine, 作为总结, 实现非常简单