天天看点

保存对象的不同状态值

保存对象的不同状态值

保存对象的不同状态值
效果
保存对象的不同状态值

说明

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      

注意