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
pod "STWorkflow"
。