简介
在OC工程中,字典转模型是很重要的一个内容,基本上每一个工程都要用到。这块内容基本上会用到第三方库,而本人自从接触到YYModel之后,就再也没有更换过,一直用。
以前都是直接使用YYModel,而这次采用了基类的封装使用方式,感觉更好。
以后,提供一个Model的基类在整个工程中使用将成为标准操作。
封装方式
头文件:
@interface WGBBaseModel : NSObject <NSCopying, NSCoding>
/// 通过JSON得到实例
+ (instancetype)instanceWithJSON:(id)json targetClass:(Class)targetClass;
/// 通过JSON得到实例数组
+ (NSArray *)arrayWithJSON:(id)json targetClass:(Class)targetClass;
@end
源文件:
#import "WGBBaseModel.h"
#import <YYModel/YYModel.h>
@implementation WGBBaseModel
#pragma mark - instance
/// 通过JSON得到实例
+ (instancetype)instanceWithJSON:(id)json targetClass:(Class)targetClass {
return [targetClass yy_modelWithJSON:json];
}
/// 通过JSON得到实例数组
+ (NSArray *)arrayWithJSON:(id)json targetClass:(Class)targetClass {
return [NSArray yy_modelArrayWithClass:targetClass json:json];
}
#pragma mark - NSCopying, NSCoding
- (void)encodeWithCoder:(NSCoder *)coder {
[self yy_modelEncodeWithCoder:coder];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
[self yy_modelInitWithCoder:coder];
}
return self;
}
- (id)copyWithZone:(NSZone *)zone {
return [self yy_modelCopy];
}
- (NSUInteger)hash {
return [self yy_modelHash];
}
- (BOOL)isEqual:(id)object {
return [self yy_modelIsEqual:object];
}
@end
协议
-
也就是拷贝协议和编码协议<NSCopying, NSCoding>
-
自定义类要用copy方法,要缓存本地,就需要实现这两个协议
-
大多数时候是不需要的,但是一旦用到,就会非常繁琐
-
用YYModel实现,非常简单。所以这部分内容写在基类中,价值非常大
-
相等比较,也是非常有用的。如果不用YYModel,自定义Model的相等就需要自己实现,非常麻烦。
- (NSUInteger)hash {
return [self yy_modelHash];
}
- (BOOL)isEqual:(id)object {
return [self yy_modelIsEqual:object];
}
- 这些基础的内容在基类中用YYModel实现之后,自定义的Model就可以缓存本地,进行比较,进行复制,进行比较等等都可以随意使用,非常方便。
字典转模型
-
网络接口过来,响应一般是字典或者字典的数组。直接使用,记忆字段很不方便。所以OC一般都要转换成模型Model,方便使用。
-
字典转单个Model,或者字典的数组转Model的数组,是最多的两种使用场景,所以在基类中进行封装一下。
/// 通过JSON得到实例
+ (instancetype)instanceWithJSON:(id)json targetClass:(Class)targetClass {
return [targetClass yy_modelWithJSON:json];
}
/// 通过JSON得到实例数组
+ (NSArray *)arrayWithJSON:(id)json targetClass:(Class)targetClass {
return [NSArray yy_modelArrayWithClass:targetClass json:json];
}
模型转字典
-
一般用在给接口提供参数,使用场景很少。
-
给接口提供参数,还是直接使用字典方便。
-
所以,模型转字典这部分不封装。
例子
字典转单个模型
- 模型定义,用上自定义的基类,隐藏了YYModel的使用
@interface WGBUserInfoModel : WGBBaseModel
/// userId
@property(copy, nonatomic) NSString *userId;
/// 用户名
@property(copy, nonatomic) NSString *userName;
/// barCode
@property(copy, nonatomic) NSString *barCode;
/// 版本号
@property(assign, nonatomic) NSInteger versionCode;
@end
- 直接使用封装的方法进行字典转模型,不需要直接调用YYModel的方法
/// 字典转模型
WGBUserInfoModel *userInfoModel = [WGBUserInfoModel instanceWithJSON:response targetClass:[WGBUserInfoModel class]];
字典数组转模型数组
- 模型定义
@interface WGBFinePhotoModel : WGBBaseModel
/// 已有的拍照数量
@property(assign, nonatomic) NSInteger hasPhotoNumber;
/// 总共需要拍照的数量;默认拍照数量
@property(assign, nonatomic) NSInteger totalPhotoNumber;
/// 已有照片的url列表
@property(copy, nonatomic) NSArray<NSString *> *picList;
/// 备注
@property(copy, nonatomic) NSString *remark;
@end
- 转模型数组
/// 转模型数组
NSArray<WGBFinePhotoModel *> *fineList = [WGBFinePhotoModel arrayWithJSON:response targetClass:[WGBFinePhotoModel class]];
网友评论