How to deactive the state machine
nanatlantica opened this issue · comments
I only found the activate method, can't found the deactivate method
@nanatlantica
You should determine terminate state.
After that you could throw event "switchToTerminateState".
And cleanup pointer to this state machine.
- (TKStateMachine *)stateMachine {
return _stateMachine ?: (_stateMachine = [TKStateMachine new], _stateMachine);
}
- (void)activate {
if (self.stateMachine.isActive) {
NSLog(@"%@ %@ stateMachine is active? (%@)", self.debugDescription, NSStringFromSelector(_cmd), self.stateMachine.isActive ? @"YES" : @"NO");
}
else {
// setup machine
[self setupStateMachine:self.stateMachine];
[self.stateMachine activate];
}
}
- (TKStateMachine *)setupStateMachine:(TKStateMachine *)machine {
// for example, you could setup machine here or choose special method for that.
// you need special event that will switch machine to terminate state from ANY state. (except terminate state, of course, it is useless :) )
// you determine states
NSArray *states = @[InitialState, TerminateState, CustomStateOne, CustomStateTwo];
NSArray *statesExceptTerminateState = @[...];
TKEvent *terminatedEvent = [TKEvent eventWithName:[TKStateMachine eventNameTerminated] transitioningFromStates:statesExceptTerminateState toState:terminatedState];
NSArray *events = @[...];
[machine addStates:states];
[machine addEvents:events];
// initial state
machine.initialState = states[0]; // InitialState is first.
return machine;
}
// suppose that you have terminate state.
// event name is eventNameTerminated
- (void)deactivate {
[self.stateMachine fireEvent:[self.stateMachine eventNamed:[TKStateMachine eventNameTerminated]] userInfo:nil error:nil];
self.stateMachine = nil;
}
@interface TKStateMachine (CustomEvents)
+ (NSString *)eventNameTerminated;
@end
@lolgear ,Thank you for your answer! And the state machine had worked correctly in my project more than 2 years