An Objective-C library for elegantly implementing state machines.
当前访问频次受限,请登录后继续访问
以下内容由 AI 翻译,如有问题请 点此提交 issue 反馈
过渡工具包(TransitionKit)
一个简洁而优雅的基于块(block)的API,用于在Objective-C中实现状态机
TransitionKit是小巧的Cocoa库,提供了在Objective-C中实现状态机的接口。它功能齐全,文档详尽,并经过了彻底的单元测试。状态机是管理应用程序复杂度的有效方式,TransitionKit通过一个优雅的API,帮助您在下一个iOS或Mac OS X应用中轻松实现状态机。
功能特性
- 支持任意数量的状态和事件。
- 状态和事件都有一套完整的基于块的回调,用于响应状态变迁。
- 状态、事件和状态机均符合NSCopying和NSCoding协议,便于在自定义类中集成归档和复制功能。
- 强制执行。状态机包括运行时检查以发现配置错误,方便调试并信赖您的状态机。
- 迁移支持通过
userInfo字典包含任意用户数据,便于在整个回调过程中广播元数据。 - 完全注释。整个库使用Appledoc进行了标记。
- 经过充分的单元测试。确保其可靠性,让您放心修改。
- 轻量级。TransitionKit除了Foundation库外没有其他依赖项,并且同时适用于iOS和Mac OS X。
通过CocoaPods安装
推荐的安装方法是通过CocoaPods包管理器,它提供灵活的依赖管理并简化安装过程。建议使用CocoaPods ≥0.16.0 和通过Homebrew安装的Git ≥1.8.0。
如果未安装CocoaPods,请先安装:
$ [sudo] gem install cocoapods
$ pod setup
进入你的Xcode项目目录,创建并编辑Podfile,添加TransitionKit:
$ cd /path/to/MyProject
$ touch Podfile
$ edit Podfile
platform :ios, '5.0'
# 或者 platform :osx, '10.7'
pod 'TransitionKit', '~> 2.0.0'
将TransitionKit集成到项目中:
$ pod install
从.xcworkspace文件打开你的项目(而非通常的项目文件):
$ open MyProject.xcworkspace
示例
简单示例
以下示例展示了一个简单的状态机,该状态机模拟收件箱中的消息状态。
TKStateMachine *inboxStateMachine = [TKStateMachine new];
TKState *unread = [TKState stateWithName:@"Unread"];
[unread setDidEnterStateBlock:^(TKState *state, TKTransition *transition) {
[self incrementUnreadCount];
}];
TKState *read = [TKState stateWithName:@"Read"];
[read setDidExitStateBlock:^(TKState *state, TKTransition *transition) {
[self decrementUnreadCount];
}];
TKState *deleted = [TKState stateWithName:@"Deleted"];
[deleted setDidEnterStateBlock:^(TKState *state, TKTransition *transition) {
[self moveMessageToTrash];
}];
[inboxStateMachine addStates:@[ unread, read, deleted ]];
inboxStateMachine.initialState = unread;
TKEvent *viewMessage = [TKEvent eventWithName:@"View Message" transitioningFromStates:@[ unread ] toState:read];
TKEvent *deleteMessage = [TKEvent eventWithName:@"Delete Message" transitioningFromStates:@[ read, unread ] toState:deleted];
TKEvent *markAsUnread = [TKEvent eventWithName:@"Mark as Unread" transitioningFromStates:@[ read, deleted ] toState:unread];
[inboxStateMachine addEvents:@[ viewMessage, deleteMessage, markAsUnread ]];
// 激活状态机
[inboxStateMachine activate];
[inboxStateMachine isInState:@"Unread"]; // 返回YES,因为这是初始状态
// 触发一些事件
NSDictionary *userInfo = nil;
NSError *error = nil;
BOOL success = [inboxStateMachine fireEvent:@"View Message" userInfo:userInfo error:&error]; // 返回YES
success = [inboxStateMachine fireEvent:@"Delete Message" userInfo:userInfo error:&error]; // 返回YES
success = [inboxStateMachine fireEvent:@"Mark as Unread" userInfo:userInfo error:&error]; // 返回YES
success = [inboxStateMachine canFireEvent:@"Mark as Unread"]; // 返回NO,因为规则不允许
// 错误:不能把未读消息标记为未读
success = [inboxStateMachine fireEvent:@"Mark as Unread" userInfo:nil error:&error]; // 返回NO
// error是一个TKInvalidTransitionError,带有描述性错误信息和失败原因
单元测试
TransitionKit使用BDD框架Kiwi进行测试。要运行这些测试,请遵循以下步骤:
- 使用CocoaPods安装依赖项:
pod install - 打开工作空间:
open TransitionKit.xcworkspace - 通过“产品”菜单 > “测试”运行规范
联系方式
布莱克·沃特尔斯
- GitHub个人主页
- 邮箱:blakewatters@gmail.com
许可证
TransitionKit遵循Apache 2许可证。详情请见LICENSE文件。


