保存对象的不同状态值

简介:

保存对象的不同状态值

 

效果

 

说明

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

注意

 


目录
相关文章
|
JavaScript
判断函数是否标记为async
判断函数是否标记为async
判断函数是否标记为async
|
8月前
|
存储 弹性计算 运维
错误次数保存到变量2
【4月更文挑战第30天】
25 0
|
8月前
|
Python
改变循环执行的状态
在编程中,循环是常用的控制结构之一,它允许代码块在一定条件下重复执行。然而,有时候我们可能需要在循环执行过程中改变其状态,比如提前终止循环或跳过当前迭代进入下一次迭代。Python提供了break和continue语句,帮助我们改变循环的执行状态。下面,我们将详细介绍如何使用这两个语句来改变循环的执行状态,并附上示例代码。
69 0
|
存储 数据库 Python
保存变量
在编程中,&quot;保存变量&quot;通常指将一个变量的值保存到文件或数据库中,以便在程序下次运行时能够再次使用该值。这个过程通常称为&quot;持久化&quot;,因为变量的值被保存到磁盘上,从而使得程序能够跨越多个会话。
82 1
NSKeyedArchiver保存对象到本地
NSKeyedArchiver保存对象到本地
74 0
|
存储 算法
保存带有循环的表
保存带有循环的表
98 0
改变状态和改变指定回调顺序的方法
改变状态和改变指定回调顺序的方法
92 0
|
SQL 数据库连接 数据库
实时错误“91” 对象变量或with块变量未设置”
实时错误“91” 对象变量或with块变量未设置”
890 0
实时错误“91” 对象变量或with块变量未设置”
|
SQL 数据库连接 数据库
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
实时错误 ‘91‘ :对象变量或with块变量未设置
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)
325 0
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)