儲存對象的不同狀态值
效果說明
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
注意