有限状态机在iOS中的应用

2017-07-16  本文已影响558人  0976e082f3c4

有限状态机(Finite-State Machine, FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

其实我们平常和很多状态机都打过交道,比如正则表达式、网络协议(如TCP协议状态机)、游戏设计、字符串匹配等等,可能大多数时候我们都没意识到,接下来我们简略了解下状态机。

基本概念

如下图状态表:

状态表

关于状态机的详细知识可以参考:
UML状态图的实用C/C++设计
ERLANG

在iOS中的使用

背景

假设我们要设计一款网络视频播放器,有基本的播放、暂停功能,当缓冲好时可以进行播放,当URL错误或者视频资源错误时播放失败,我们发现,当我们去描述一个事物以及它的功能时,总是离不开它的状态,如这个播放器,我们可以定义它有播放失败、缓冲中、将要播放…等等状态。

设计

我们可以用状态机去实现这样的功能。

enum VideoPlayerState {
    case failed,           // 播放失败
         buffering,        // 缓冲中
         readyToPlay,      // 将要播放
         playing,          // 播放中
         paused,           // 播放暂停
         finished          // 播放完毕
}
var state: VideoPlayerState = .paused {
    didSet {
        switch state {
            case .failed:
            // 当视频加载失败时,我希望去执行的一些事件,比如弹出提示框
            popReminderView()
            
            case .buffering:
            
            case .readyToPlay:
            
            case .playing:
            
            case .paused:
            
            case .finished:
            
        }
    }
}
// 比如我们重写网络层的一些方法,当缓冲好时准备播放
networkRequestCompletion() {

    state = .readyToPlay

}

这样,通过state我们能很清晰的知道现在播放器是什么样应该做什么事,在我们的业务逻辑中,当状态变化时通过didSet我们能很方便的去响应对应状态下应该执行的行为。

总结

整篇文章质量或许不是很高,因为还没有大量的代码实践让我去有一个更深更全的体会,但是希望能带给我自己和读者们一点抛砖引玉的效果。我们在编码、设计过程中,多去思考一些,什么地方用什么样的模式更好,比如状态机,来使我们的代码更解耦,易维护,高扩展。

这里有一篇关于Objective-c状态机的实现,更抽象,其中用到的枚举值自动转字符串通用方案很有意思,大家可以去看看。
这篇《iOS APP 架构漫谈二》列举了很具体的运用场景,可以参考。
同时参考的文章有:

关于状态记的开源库推荐:

上一篇 下一篇

猜你喜欢

热点阅读