blakewatters / TransitionKit

An Objective-C library for elegantly implementing state machines.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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