1、背景介绍
最近有个项目主要是将复杂的一个流程做到Iphone手机上。这个流程很复杂,面对不同的客户会有不同的流程。但是将
这些流程原子化之后,可分为8个原子步骤组合而成,每个原子步骤由一个单独的页面完成。不同的客户原子组合会有所不同;
例如,A客户是ABCDEFGH流程,B客户可能就是ACBDEFGH流程。每个页面直接用户会填写很多信息数据,这些数据需要下一界面
或者下下个界面使用,显然采取简单的页面数据传递或者消息广播等机制是不能满足这样的数据传递需求的。在这种场景下, 经过我们
商议,打算做一个管理类OTADataManager,页面之间不再相互传递数据,页面直接与管理类进行数据交互。
2、管理类的设计与实现
根据上述描述,此管理类OTADataManager的生命周期应该从第一个页面开始到最后一个页面结束,所以此管理类最好设计成单例模式。
而且需求要求应用程序要是crash等异常导致退出时,管理类的数据也应该继续存在,所以管理类的数据还需要在ios文件系统中进行备份。
管理类的基本功能操作应该有添加元素、删除元素、读取元素、清空、元素持久化等操作。
(1) OTADataManager类的方法声明如下:
OTADataManager.h文件如下:
#import <Foundation/Foundation.h>
//用户的基本信息
#define KUserName @"UserName"
#define KClientId @"ClientID"
#define KPhoneNumber @"PhoneNumber"
#define KBirthDay @"BirthDay"
@interface OTADataManager : NSObject
@property (nonatomic, retain) NSMutableDictionary *dicPersonalInfo;
// 管理类实例化方法
+ (OTADataManager *) Instance;
//存储数据到管理类
- (void)SetOTAValue:(id)valueData ForKey:(NSString *)otaKey;
//从管理类获取数据
- (id) GetOTAValue:(NSString *)otaKey;
// 删除管理类单个Key对象
- (void) RemoveOTAValueForKey:(NSString *)otaKey;
//清空管理类数据
- (void) ClearOTAValue;
@end
</span>
(2)OTADataManager类的实现如下:
#import "OTADataManager.h"
//保存个人信息
#define KeyPersonalInfo @"PersonalInfo"
static OTADataManager *g_OTADataManager = nil; //单例设计模式
@implementation OTADataManager
{
//字典集set表
NSMutableSet *mPersonalKeySet;
}
- (id)init
{
self = [super init];
if (self) {
//初始化字典集
[self initializeDictionary];
}
return self;
}
+ (OTADataManager *)Instance
{
if (nil == g_OTADataManager) {
g_OTADataManager = [[OTADataManager alloc] init];
}
return g_OTADataManager;
}
//字典序的初始化
- (void) initDicData{
}
//管理类数据持久化
- (void) dataPersistence:(NSString *)dicType{
}
//存储数据到管理类方法
- (void) SetOTAValue:(id)valueData ForKey:(NSString *)otaKey{
}
//从管理类中获取数据
- (id) GetOTAValue:(NSString *)otaKey{
}
//删除管理类单个Key对象
- (void) RemoveOTAValueForKey:(NSString *)otaKey{
}
//清空管理类数据
- (void) ClearOTAValue {
}
</span>
(3) 初始化方法initDicData的实现,主要是字典序的初始化,初始化原始数据:
- (void) initializeDictionary
{
//初始化字典集
mPersonalKeySet = [NSMutableSet setWithObjects: KUserName, KClientId, KPhoneNumber, KBirthDay, nil];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//从沙盒目录中取数据
_dicPersonalInfo = [NSMutableDictionary dictionaryWithDictionary:[userDefaults objectForKey:KeyPersonalInfo]];
if ((nil == _dicPersonalInfo))
{
_dicPersonalInfo = [[NSMutableDictionary alloc]init];
}
}</span>
(4) 管理类数据持久化,数据保存到沙箱目录plist中
- (void) dataPersistence:(NSString *)dicType{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *tmpDicData;
if ([dicType isEqualToString:KeyPersonalInfo]){
tmpDicData = _dicPersonalInfo;
[userDefaults setObject:tmpDicData forKey:KeyPersonalInfo];
}
[userDefaults synchronize];
}</span>
(5) 存储数据到管理类方法,可以直接存储任意类型的数据
- (void) SetOTAValue:(id)valueData ForKey:(NSString *)otaKey{
if ((valueData == NULL) || ((NSNull *)valueData == [NSNull null])
|| (valueData == nil) || (valueData == Nil))
{
valueData = @""; // 临时赋为空值
}
if ([mPersonalKeySet containsObject:otaKey])
{
NSString *wSaveStr = valueData;
[_dicPersonalInfo setObject:wSaveStr forKey:otaKey];
//每次数据更新,同步一次到沙盒目录
[self dataPersistence: KeyPersonalInfo];
}
}
(6) 从管理类中读取数据
- (id) GetOTAValue:(NSString *)otaKey
{
if (nil == otaKey || [otaKey isEqualToString:@""])
{
return nil;
}
if ([mPersonalKeySet containsObject:otaKey])
{
NSString *wReturnData = nil;
wReturnData = [_dicPersonalInfo objectForKey:otaKey];
return wReturnData;
}
else // 传入的otaKey错误,字典中没有对应的Key
{
return nil;
}
}
(7)删除管理类的单个key对象
- (void) RemoveOTAValueForKey:(NSString *)otaKey
{
if (nil == otaKey || [otaKey isEqualToString:@""])
{
NSLog(@"log OTADataManager---移除的otaKey无效\n”);
return;
}
if ([mPersonalKeySet containsObject:otaKey])
{
[_dicPersonalInfo removeObjectForKey:otaKey];
[self dataPersistence: KeyPersonalInfo];
}
else // 传入的otaKey错误,dic没有对应的Key
{
NSlog(@“log OTADataManager---没有对应的otaKey\n");
}
}
(8) 清空管理类数据
- (void) ClearOTAValue
{
[_dicPersonalInfo removeAllObjects];
[self dataPersistence: KeyPersonalInfo];
}
3、管理类的使用
如上所示,管理类基本已经实现完毕。我们该如何使用这个管理它呢?
(1) 管理类的实例化:
在需要使用管理类的controller类中进行如下的实现即可:
OTADataManager *wDataManager = [OTADataManager Instance];
(2) 存储数据到管理类
OTADataManager *wDataManager = [OTADataManager Instance];
[wDataManager SetOTAValue:@"13012341234" ForKey: KPhoneNumber];
(3) 从管理类中读取数据
OTADataManager *wDataManager = [OTADataManager Instance];
NSString *wBirthday = [wDataManager GetOTAValue:KBirthDay];
(4) 删除管理类中的数据
OTADataManager *wDataManager = [OTADataManager Instance];
[wDataManager RemoveOTAValueForKey:KClientID];
(5) 清空管理类中的数据
OTADataManager *wDataManager = [OTADataManager Instance];
[wOTADataManager ClearOTAValue]; // 清除旧的管理类数据
4、参考文献
《 Objective-C编程之道》 ------[美] Carlo Chung