保存对象的不同状态值
效果说明
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
注意