STWorkflow 1.0.1

STWorkflow 1.0.1

测试已测试
语言 Obj-CObjective C
许可证 MIT
发布最新发布2014年12月

iSofTom 维护。



  • 作者:
  • iSofTom

STWorkflow 允许在 Objective-C 中编写有限状态机。它处理简单条件(两个退出)和多条件(N 个退出)。它允许执行操作,并调度状态以允许并行执行多个状态并同步这些状态结束。每个状态(条件或操作)可以是同步的或异步的。

如何使用

首先,您必须创建所有您的状态。在 STWorkflow 中,操作以及条件都是状态!从您的 STWorkflow 实例,您将可以访问几种构造方法,一个针对每种状态类型。

self.workflow = [[STWorkflow alloc] init];

STStateSimpleCondition* simpleCondition = [self.workflow createSimpleConditionNamed:@"simple condition"];
STStateMultipleCondition* multipleCondition = [self.workflow createMultipleConditionNamed:@"multiple condition"];
STStateAction* action = [self.workflow createActionNamed:@"action"];
STStateDispatch* dispatch = [self.workflow createDispatchNamed:@"dispatch"];

有 4 种状态类型

  • STStateSimpleCondition 是一个简单条件。
  • STStateMultipleCondition 是一个多条件。
  • STStateAction 是一个操作。
  • STStateDispatch 是一个调度状态。

一旦创建了所有状态,您可以配置每个状态。您必须设置条件或操作块和下一个状态。例如

同步状态

配置简单条件

[simpleCondition setCondition:^BOOL{
    return YES;
}];
[simpleCondition setSuccessState:successState];
[simpleCondition setFailureState:failureState];

配置多条件

NSArray* keys @[@"key1", @"key2", @"key3"];
[multipleCondition setCondition:^BOOL{
    return [keys objectAtIndex:1];
}];
[multipleCondition setNextState:state1 forKey:[keys objectAtIndex:0]];
[multipleCondition setNextState:state2 forKey:[keys objectAtIndex:1]];
[multipleCondition setNextState:state3 forKey:[keys objectAtIndex:2]];

配置操作

[syncAction setAction:^{
    NSLog(@"synchronous action");
}];
[syncAction setNextState:nextState];

异步状态

您也可以配置每个状态为异步状态

配置异步简单条件

[simpleCondition setCondition:^(STStateSimpleCondition* s){
    [self aMethodThatAsynchronouslyRetrieveBooleanValue:^(BOOL result) {
        [s resumeWithSuccess:result];
    }];
}];
[simpleCondition setSuccessState:successState];
[simpleCondition setFailureState:failureState];

配置异步多条件

NSArray* keys @[@"key1", @"key2", @"key3"];
[multipleCondition setCondition:^(STStateMultipleCondition* s){
    [self aMethodThatAsynchronouslyRetrieveIndexValue:^(NSInteger index) {
        [s resumeWithKey:[keys objectAtIndex:index]];
    }];
}];
[multipleCondition setNextState:state1 forKey:[keys objectAtIndex:0]];
[multipleCondition setNextState:state2 forKey:[keys objectAtIndex:1]];
[multipleCondition setNextState:state3 forKey:[keys objectAtIndex:2]];

配置异步操作

[syncAction setAction:^(STStateAction* s){
    [self aMethodThatAsynchronouslyExecuteAnAction:^{
        [s resume];
    }];
}];
[syncAction setNextState:nextState];

最终状态

此外,您必须标记每个最终状态

[finalState flagAsFinalState];

调度状态

第四种状态类型略有不同,它允许并行执行一些状态,并且将等待直到每个并行状态达到最终状态,然后执行其下一个状态。为了在该调度状态中封装状态,您必须从该调度状态创建状态

STStateSimpleCondition* dispatchedSimpleCondition = [dispatch createSimpleConditionNamed:@"simple condition"];
STStateMultipleCondition* dispatchedMultipleCondition = [dispatch createMultipleConditionNamed:@"multiple condition"];
STStateAction* dispatchedAction = [dispatch createActionNamed:@"action"];
STStateDispatch* dispatchedDispatch = [dispatch createDispatchNamed:@"dispatch"];

[dispatch setNextState:anOtherState];

开始

最后,您必须启动您的流程。如果您的操作是异步操作,不要忘记保留它。

[self.workflow start];

调试

您可以将工作流程记录下来。它会记录每个状态以及它们之间的关系。例如

Check first launch (S)
Y- Fetch something (A)
|  Final state (A) !
N- An other check (S)
|  Y- Final state (S) !
|  N- Log something (S)
|  |  Final state (S) !

在每一个状态之后,会用一个字母表示其类型(S:简单条件,M:多个条件,A:动作,D:派发)。感叹号表示最终状态,星号表示之前已记录过的状态(以防止出现循环)。

安装

要将此组件包含到您的项目中,我建议您使用Cocoapods

  • 在您的Podfile中添加pod "STWorkflow"