天天看點

儲存對象的不同狀态值

儲存對象的不同狀态值

儲存對象的不同狀态值
效果
儲存對象的不同狀态值

說明

1. 存儲不同的狀态,對于一個對象而言還是很有必要的,尤其是需要頻繁切換狀态的時候.

2. block是對象,是可以存儲在集合中的.

源碼

https://github.com/YouXianMing/ViewState

//
//  NSObject+StatePattern.h
//  ViewState
//
//  Created by YouXianMing on 15/6/30.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void(^NSObjectBlock_t)(id object);

@interface NSObject (StatePattern)

/**
 *  存儲狀态的字典
 */
@property (nonatomic, strong, readonly) NSMutableDictionary  *stateDictionary;

/**
 *  注冊狀态
 *
 *  @param stateString 狀态标簽值
 *  @param stateBlock  儲存狀态的block
 */
- (void)registerState:(NSString *)stateString stateBlock:(NSObjectBlock_t)stateBlock;

/**
 *  切換到指定标簽的狀态
 *
 *  @param stateString 狀态标簽值
 */
- (void)switchToState:(NSString *)stateString;

@end      
//
//  NSObject+StatePattern.m
//  ViewState
//
//  Created by YouXianMing on 15/6/30.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "NSObject+StatePattern.h"
#import <objc/runtime.h>

@implementation NSObject (StatePattern)


- (void)registerState:(NSString *)stateString stateBlock:(NSObjectBlock_t)stateBlock {

    [self setup];
    
    [self.stateDictionary setObject:stateBlock forKey:stateString];
}


- (void)switchToState:(NSString *)stateString {

    [self setup];
    
    NSObjectBlock_t block = [self.stateDictionary objectForKey:stateString];
    
    if (block) {
        
        __weak id weakSelf = self;
        block(weakSelf);
    }
}


- (void)setup {
    
    if (self.stateDictionary == nil) {
        self.stateDictionary = [NSMutableDictionary dictionary];
    }
}


#pragma mark - runtime屬性
@dynamic stateDictionary;
NSString * const _recognizerStateDictionary = @"_recognizerStateDictionary";

- (void)setStateDictionary:(NSMutableDictionary *)stateDictionary {
    
    objc_setAssociatedObject(self, (__bridge const void *)(_recognizerStateDictionary), stateDictionary, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSMutableDictionary *)stateDictionary {
    
    return objc_getAssociatedObject(self, (__bridge const void *)(_recognizerStateDictionary));
}


@end      

注意