TransitionKit:Objective-C状态机实现库,基于块的优雅API

An Objective-C library for elegantly implementing state machines.

分支1Tags8

过渡工具包(TransitionKit)

============= 构建状态
CocoaPods 版本
CocoaPods 平台

一个简洁而优雅的基于块(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进行测试。要运行这些测试,请遵循以下步骤:

  1. 使用CocoaPods安装依赖项:pod install
  2. 打开工作空间:open TransitionKit.xcworkspace
  3. 通过“产品”菜单 > “测试”运行规范

联系方式

布莱克·沃特尔斯

许可证

TransitionKit遵循Apache 2许可证。详情请见LICENSE文件。

项目介绍

一个用于优雅实现状态机的Objective-C库。【此简介由AI生成】

定制我的领域
551.33 K131访问 GitHub