保存对象的不同状态值

保存对象的不同状态值

 

效果

 

说明

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

注意

 

时间: 2024-12-22 10:13:15

保存对象的不同状态值的相关文章

关于序列化:PHP 拥有序列化方法,可以返回对象的字符串表示。但序列化只保存对象的成员数据而不包话方法

对象|数据|字符串     PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象.这就是所谓的序列化机制.PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示.然而,序列化只保存了对象的成员数据而不包话方法. 在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有

hibernate配置-使用注解生成的uuid.hex 调用save()保存对象不发语句也不报错

问题描述 使用注解生成的uuid.hex 调用save()保存对象不发语句也不报错 @Id @GenericGenerator(name=""systemUUID""strategy=""uuid"") @GeneratedValue(generator=""systemUUID"") @Column(name = ""ID"" unique =

hibernate save-hibernate执行保存对象时出现异常:org.hibernate.exception.GenericJDBCException

问题描述 hibernate执行保存对象时出现异常:org.hibernate.exception.GenericJDBCException hibernate执行保存对象时出现异常:org.hibernate.exception.GenericJDBCException: could not insert: [com.hibernate.domain.User] Caused by: java.sql.SQLException: Field 'user_id' doesn't have a d

android-在列表中保存对象出现exception

问题描述 在列表中保存对象出现exception 创建了名为Placeslist的类,想对其列表,在里面保存对象,但是报出异常:**Android.java.lang.NullPointerException** placeslist class: public class Placeslist { @Key public String status; @Key public String id; @Key public String name; @Key public String refer

jsp问题-Session对象可以保存对象吗?

问题描述 Session对象可以保存对象吗? session对象可以保存各种对象,而Cookie只能保存字符串.对此,大家是怎么理解的?特别是 session可以保存各种对象,能举一个例子吗? 谢谢各位! 解决方案 例如购物系统,当你登陆成功时,你登陆时的信息就被封装在一个User对象中,然后把User对象放在session中,后面的展示页面就有欢迎某某登陆,此时的某某就是在session中或得的.还有购物车也是这样的. 解决方案二: Cookie是保存在客户端的字符串文件,所以它只能保存字符串

android 关于使用SharedPreferences来保存对象里既有属性又有集合的问题

问题描述 android 关于使用SharedPreferences来保存对象里既有属性又有集合的问题 大神们,帮帮忙呀!拜托!http://bbs.csdn.net/topics/390983835 解决方案 先把PlayList对象转换为JSON形式的字符串,用SharedPreferences来保存字符串. /** * 把播放列表转换为JSON形式以字符串形式保存 * @param context * @param object 播放列表对象 */ public static void g

hibernate-Spring,Hibernate保存对象时的问题

问题描述 Spring,Hibernate保存对象时的问题 有两个实体类User和Department.建立双向多对一关联. User是多的一端 @Entitypublic class User implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name=""id"") private Integer id; @Column(name=&quo

sharedpreferences如何保存对象

昨天做了一个搜索历史的功能,然后根据搜索的历史可以调回到上一个页面,这里涉及到一个用sharedpreferences保存对象的问题,sharedpreferences是不能够直接保存对象的,我们需要将对象序列化成一个字符串进行存储. 例如:PlayList这样一个对象 public static void getJsonStringByEntity(Context context, Object object) { String strJson = ""; Gson gson = n

GWT AppEngine 保存对象序列号.

想这个Google的app 都是可以先自己放一个免费的程序到服务器上面. 就是一个高兴的事情.   前几天研究了下GWT.关于做界面还是非常容易的.   java的代码想怎么写就怎么写.非常的高效率.   现在研究下如何将数据保存.   参考官方的文档.是通过JDO实现的.我也没有想太多.直接照着官方的文档写了个demo.   1.定义一个JDO对象.   package com.test.demo.jdo; import javax.jdo.annotations.IdGeneratorStr