Objective c 处理顺序和异步事件的状态机
我创建了这个Objective c 处理顺序和异步事件的状态机,objective-c,enums,state,state-machine,Objective C,Enums,State,State Machine,我创建了这个状态机来处理事件。首先,我不确定我的实现,,因为我不使用转换表或类似的东西,而是简单地输入下一个需要发生的事件/状态。我认为这比在处理事件a的方法中调用方法来处理事件b更干净,对吗 其次,因为有些方法有参数-这不是swift中枚举成员可以有关联值的地方,所以我通过withObj参数为其添加了一个参数。我不认为这有什么问题,但我想知道,从你的角度来看,这是否混淆/违反了某些东西 我还发现这对异步任务非常有用,因此在任务完成后,我将结果值设置为一个局部变量,然后使用该存储值和许多其他现有
状态机来处理事件。首先,我不确定我的实现,,因为我不使用转换表或类似的东西,而是简单地输入下一个需要发生的事件/状态。我认为这比在处理事件a
的方法中调用方法来处理事件b
更干净,对吗
其次,因为有些方法有参数-这不是swift
中枚举成员可以有关联值的地方,所以我通过withObj
参数为其添加了一个参数。我不认为这有什么问题,但我想知道,从你的角度来看,这是否混淆/违反了某些东西
我还发现这对异步任务非常有用,因此在任务完成后,我将结果值设置为一个局部变量,然后使用该存储值和许多其他现有值将状态更新为packData
。这个值打包在一个字节数组中,不能在块中使用,所以这是一个有用的解决方法——尽管我还没有测试过
通过enum
定义状态,如下所示:
typedef NS_ENUM(NSUInteger, ExampleState) {
ExampleStateIdle,
ExampleStateWaitingForAsyncTask,
ExampleStateReadyToPack,
ExampleStateRespond,
ExampleStateSomethingInProgress,
ExampleStateSomething2InProgress,
ExampleStateComplete
};
在这里,我定义了一个使用helper方法处理每个事件的方法对于可能具有关联值的任何状态,我还有一个额外的参数
- (void)updateState:(ExampleState)state withObj:(id)obj {
self.currentState = state;
switch (state) {
case ExampleStateWaitingForAsyncTask:
[self getAsyncInfo];
break;
case ExampleStateReadyToPack:
[self packData];
break;
case ExampleStateRespond:
[self respond:obj];
break;
case ExampleStateComplete:
[self showPopup];
break;
default:
break;
}
}
用法示例:
-(void)packData {
NSData *data = [NSData dataWithBytes:&result length:resultIndex];
// next step is to respond to `client`/`central` with data
[self updateState:ExampleStateRespond withObj:data];
}
问题是什么?@Willeke这是一个干净而正确的状态机实现吗?虽然我的用例很简单,但其他实现更复杂、更抽象。看到问题了吗?@Willeke这是一个干净、正确的状态机实现吗?虽然我的用例非常简单,但其他实现更复杂和抽象