json请求,回包处理,解析,缓存,发出通知刷新界面
#头文件
#import <Foundation/Foundation.h>
#import "ServerJsonPackage.h"
#import "MJExtension.h"
#define kPrivilegeOperateInfoJson @"kPrivilegeOperateInfoJson"
#define kPrivilegeOperateInfoJsonFinish @"kPrivilegeOperateInfoJsonFinish"
#define PrivilegeOperateInfoJson_PACKAGE ((PrivilegeOperateInfoJson *)[ServerJsonPackage getPackage:kPrivilegeOperateInfoJson])
//json请求的数据模型
@interface PrivilegeOperateInfoModel : NSObject
@property (nonatomic, assign) NSInteger ID;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger value;
//通过字典获取模型
+(instancetype) PrivilegeOperateInfoModelWithDict:(NSDictionary *) dict;
//通过字典数组获取模型数组
+(NSArray *) PrivilegeOperateInfoModelWithDataArray:(NSArray*) data;
@end
//json请求包
@interface PrivilegeOperateInfoJson : EasyServerJsonPackage
//注册json包,把这个类的一个对象以字典形式存入框架的json的proxy中,让宏PrivilegeOperateInfoJson_PACKAGE可以直接拿到这个json包的对象
//这个json包不是单利,每次通过这个宏获取对象,都是一个对象,相当于单例
+ (void)registerPackage;
//json包对外提供的方法,通过权限ID获取权限模型
-(PrivilegeOperateInfoModel *)getInfoModelWithId:(int)privilegeId;
@end
json请求,回包处理,解析,缓存,发出通知刷新界面
#点m文件
#import "PrivilegeOperateInfoJson.h"
#import "PPClient.h"
#import "Observer.h"
#import "ServerJsonPackage.h"
#import "ServerJsonPackageHolder.h"
#import "ServerField.h"
#import "ITalkOldUrlConfig.h"
#import "NSDataDisk.h"
#import "SimpleAPI.h"
//model解析
#import "MJExtension.h"
@implementation PrivilegeOperateInfoModel
+(instancetype) PrivilegeOperateInfoModelWithDict:(NSDictionary *) dict
{
return [PrivilegeOperateInfoModel objectWithKeyValues:dict];
}
+(NSArray *) PrivilegeOperateInfoModelWithDataArray:(NSArray*) data
{
return [PrivilegeOperateInfoModel objectArrayWithKeyValuesArray:data];
}
- (NSDictionary *)replacedKeyFromPropertyName{
return @{
@"ID":@"id"
};
}
//用以归档的方法
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInteger:self.ID forKey:@"ID"];
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.value forKey:@"value"];
}
//用以归档的方法
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.ID = [aDecoder decodeIntForKey:@"ID"];
self.name = [aDecoder decodeObjectForKey:@"name"];
self.value = [aDecoder decodeIntForKey:@"value"];
}
return self;
}
@end
@implementation PrivilegeOperateInfoJson
{
NSMutableArray * privilegeOperateInfoModelArr;
NSTimeInterval _mUpdateTimeInterval;
bool _haveLoad;
}
+ (void)registerPackage
{
if (![SERVER_JSON_HOLDER getJsonPackage:kPrivilegeOperateInfoJson])
{
PrivilegeOperateInfoJson * jsonPackage = (PrivilegeOperateInfoJson *)[PrivilegeOperateInfoJson withDelegate:nil andJsonType:TYPE_SERVER_JSON_PACKAGE_DICTIONARY];
[SERVER_JSON_HOLDER registerJsonPackage:kPrivilegeOperateInfoJson withObject:jsonPackage];
}
}
-(void)onSetPostData:(id)_httpRequestObject objectType:(NSString*)szType
{
}
-(ServerJsonRequestType)requestType
{
return SERVER_JSON_REQUEST_TYPE_GET;
}
//返回是否能够发出请求
-(BOOL)canRequest
{
NSTimeInterval nowTime = [[NSDate date] timeIntervalSince1970];
if(nowTime - _mUpdateTimeInterval >10*60){
return YES;
}
return NO;
}
-(NSString*)getHttpString
{
return PrivilegeOperateInfoJsonUrl;
}
-(void)onRecvServerData:(id)_data withState:(NSInteger)kState
{
if (!_data)
{
ITLogSP(@"%@",@"data is nil");
return;
}
//mj直接转换为数组---练习代码>>>>>
NSArray * ppdataArr = [PrivilegeOperateInfoModel PrivilegeOperateInfoModelWithDataArray:_data];
//<<<<<<<<<<<<<<<<<练习代码
//mj字典转模型>>>>>>>
if (nil == privilegeOperateInfoModelArr) {
privilegeOperateInfoModelArr = [NSMutableArray array];
}
NSArray *dataArr = _data;
if (dataArr &&[dataArr isKindOfClass:[NSArray class]]) {
//将现在时间存入userdefaults
_mUpdateTimeInterval = [[NSDate date] timeIntervalSince1970];
[NSUserDefaults setObject:@(_mUpdateTimeInterval) forKey:@"kPrivilegeOperateInfoJsonTime"];
[NSUserDefaults synchronize];
//将字典转换成模型存入数组privilegeOperateInfoModelArr
[privilegeOperateInfoModelArr removeAllObjects];
for (int i=0; i<dataArr.count; i++) {
NSDictionary *dict = dataArr[i];
PrivilegeOperateInfoModel * infoModel = [[PrivilegeOperateInfoModel alloc] init];
infoModel = [PrivilegeOperateInfoModel PrivilegeOperateInfoModelWithDict:dict];
[privilegeOperateInfoModelArr addObject:infoModel];
}
}
//<<<<<<<<<<mj字典转模型
//归档
[self saveDataToDisk];
//数据接收完成发出通知让view重新获取真正数据
[[NSNotificationCenter defaultCenter] postNotificationName:kPrivilegeOperateInfoJsonFinish object:nil];
}
//获取数据的方法
-(PrivilegeOperateInfoModel *)getInfoModelWithId:(int)privilegeId
{
//先加载本地数据
[self loadDiskData];
//请求json,这里通过canRequest控制是否发送请求
[self request];
//请求完数据将数据筛选,拿出需要id的模型并返回
for(int i=0;i<privilegeOperateInfoModelArr.count;i++)
{
PrivilegeOperateInfoModel *infoModel =privilegeOperateInfoModelArr[i];
if(privilegeId == infoModel.ID)
{
return infoModel;
}
}
return nil;
}
//归档数据
- (void)saveDataToDisk
{
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
//将数组放入字典
if (privilegeOperateInfoModelArr){
[dic setObject:privilegeOperateInfoModelArr forKey:@"dataArray"];
}
//将字典归档,进行缓存
NSDataDisk *disk = [NSDataDisk withFolderName:[SimpleAPI getJsonSaveFolderName]];
[disk save2disk:self.name withObject:dic];
}
//读取本地数据
- (void)loadDiskData
{
//如果时间为nil,获取userdefaults里缓存的上次下载时间
if (_mUpdateTimeInterval <=0 ){
_mUpdateTimeInterval = [[NSUserDefaults objectForKey:@"kPrivilegeOperateInfoJsonTime"] unsignedLongLongValue];
}
//数组没有被创建,创建数组
if (privilegeOperateInfoModelArr == nil){
privilegeOperateInfoModelArr = [[NSMutableArray alloc] init];
}
//从归档中拿出数据,,haveload保证只从本地加载一次
if(privilegeOperateInfoModelArr.count <= 0 && _haveLoad == NO)
{
NSDataDisk *disk = [NSDataDisk withFolderName:[SimpleAPI getJsonSaveFolderName]];
NSDictionary *dic = [disk loadFromDisk:self.name];
NSArray *arr = [dic objectForKey:@"dataArray"];
if (arr && [arr isKindOfClass:[NSArray class]]){
[privilegeOperateInfoModelArr removeAllObjects];
[privilegeOperateInfoModelArr addObjectsFromArray:arr];
}
_haveLoad = YES;
}
}
@end