YYKit_YYModel

YYModel使用 YYKit_YYModel
文章图片
image 1.自定义属性映射 + (nullable NSDictionary *)modelCustomPropertyMapper;
例子:

//自定义类的属性 @property NSString*name; @property NSIntegerpage; @property NSString*desc; @property NSString*bookID;

//JSON { "n":"Harry Pottery", "p": 256, "ext" : { "desc" : "A book written by J.K.Rowing." }, "id" : 100010 }

//custom属性,让 json key 映射到 对象的属性。该方法在自 + (NSDictionary *)modelCustomPropertyMapper { return @{@"name" : @"n", @"page" : @"p", @"desc" : @"ext.desc",//key.path @"bookID" : @[@"ID",@"id",@"book_id"]}; //从 json 过来的key 可以是id,ID,book_id。例子中 key 为 id。 }

使用这个方法需要在自定义类里面重写该方法。
2.自定义容器映射 假如你的对象里面有容器(set,array,dic),你可以指定类型中的对象类型,因为YYModel是不知道你容器中储存的类型的。在dic中,你指定的是它value的类型。
+ ( NSDictionary *)modelContainerPropertyGenericClass;
@interface YYAuthor : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSDate *birthday; @end@interface User : NSObject @property UInt64uid; @property NSString*bookname; @property (nonatomic, strong)NSMutableArray*authors; @end

//Json数据 { "uid":123456, "bookname":"Harry", "authors":[ { "birthday":"1991-07-31T08:00:00+0800", "name":"G.Y.J.jeff" }, { "birthday":"1990-07-31T08:00:00+0800", "name":"Z.Q.Y,jhon" } ] }

\\相当于泛型说明 + (NSDictionary *)modelContainerPropertyGenericClass { return @{@"authors" : [YYAuthor class]}; }

3.根据字典返回类型 这个方法是可以根据字典里面的数据来指定当前对象的类型。
我对这个方法的理解,假如Person是父类,其子类是Man,Woman。这个时候你可以根据dic["sex"]中的value,比如valueNSStringMan,在重写的方法里 return Man.这个时候,你当前的字典转模型的实例就是Man的实例对象。
注:这就是多态
+ (nullable Class)modelCustomClassForDictionary:(NSDictionary*)dictionary;
//.h @interface Person : NSObject @property (nonatomic, copy)NSString*name; @property (nonatomic, assign)NSUIntegerage; @end@interface Man : Person @property (nonatomic, copy)NSString*wifeName; @end@interface Woman : Person @property (nonatomic, copy)NSString*husbandName; @end

//.m + (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary { if (dictionary[@"sex"] != nil) { NSString *runClass = dictionary[@"sex"]; return NSClassFromString(runClass); } else { return [self class]; } }

NSData *dataPerson = [self dataWithPath:@"person"]; Person *person = [Person modelWithJSON:dataPerson]; [person modelDescription]; 这个时候你会发现,当前person的类实际上是 Man,而不是 Person。

4.白名单,黑名单
+ (nullable NSArray *)modelPropertyBlacklist; 黑名单 + (nullable NSArray *)modelPropertyWhitelist; ; 白名单

这两个比较简单。 黑名单,故名思议,黑名单中的属性不会参与字典转模型。 白名单使用比较极端,你用了之后,只有白名单中的属性会参与字典转模型,其他属性都不参与。不推荐使用。

5.更改字典信息 该方法发生在字典转模型之前。 最后对网络字典做一次处理。
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;
.h文件 #import /* { "name":"Jeff", "age":"26", "sex":"Man", "wifeName":"ZQY" } */ @interface Person : NSObject @property NSString *name; @property NSString *age; @property NSString *sex; @property NSString *wifeName; @end

.m文件 #import "Person.h"#import @implementation Person - (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic { if ([dic[@"sex"] isEqualToString:@"Man"]) { return nil; //这里简单演示下,直接返回 nil。相当于不接受男性信息。 } return dic; //女性则不影响字典转模型。 } @end

测试 //原来json { "name":"Jeff", "age":"26", "sex":"Man", "wifeName":"ZQY" }

YYKit_YYModel
文章图片
image
//更改后json { "name":"Jeff", "age":"26", "sex":"Woman", "wifeName":"ZQY" }

YYKit_YYModel
文章图片
image 6.字典转模型补充 - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;
#import User模型 .h文件 /* { "uid":123456, "bookname":"Harry", "created":"1965-07-31T00:00:00+0000", "timestamp" : 1445534567 } */ @interface User : NSObject @property UInt64 uid; @property NSDate *created; @property NSDate *createdAt; @property NSString *bookname; @end

.m文件
#import "User.h"#import @implementation User- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic { NSNumber *timestamp = dic[@"timestamp"]; if (![timestamp isKindOfClass:[NSNumber class]]) return NO; _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue]; return YES; }@end

实现
User *user = [User yy_modelWithDictionary:@{ @"uid":@123456, @"bookname":@"Harry", @"created":@"1965-07-31T00:00:00+0000", @"timestamp" :@1445534567 }]; NSLog(@"%@",user);

YYKit_YYModel
文章图片
image 字典转模型结束后createdAt属性应该是空的,因为timestampcreatedAt 不一样。但你在这里赋值,手动把timestamp的属性赋值给_createdAt.这个有点类似第一点的 自定义属性映射(本篇文章第一条)。
注:此处如果return NO,dic->model将失败。
7.模型转字典补充 - (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;
这个方法和第6条是相对应的关系。这里是model->json的补充。
假如自己model 中有_createdAt,那 model 转到 json 中的timestamp会被赋值。
注:此处如果 return NO,model->dict将失败。
.m文件
//模型转字典补充 -(BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic { if (!_createdAt) return NO; dic[@"timestamp"] = @(_createdAt.timeIntervalSince1970); return YES; }

测试
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. User *user = [User yy_modelWithDictionary:@{ @"uid":@123456, @"bookname":@"Harry", @"created":@"1965-07-31T00:00:00+0000", @"timestamp" :@1445534567 }]; NSLog(@"%@",user); NSString *userStr = [user yy_modelToJSONString]; NSLog(@"%@",userStr); }

结果如图:

YYKit_YYModel
文章图片
image 8.字典用法和数组的用法 + (nullable NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json;
+ (nullable NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json;
模型
#import /* [{"birthday":"1991-07-31T08:00:00+0800", "name":"G.Y.J.jeff"}, {"birthday":"1990-07-31T08:00:00+0800", "name":"Z.Q.Y,jhon"}] */ @interface Author : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSString *birthday; @end

实现
NSArray *array = @[@{@"birthday":@"1991-07-31T08:00:00+0800", @"name":@"G.Y.J.jeff"}, @{@"birthday":@"1990-07-31T08:00:00+0800", @"name":@"Z.Q.Y,jhon"}]; NSArray *arrT = [NSArray yy_modelArrayWithClass:[Author class] json:array]; NSLog(@"arrT = %@",arrT);

【YYKit_YYModel】结果如图:

YYKit_YYModel
文章图片
image

    推荐阅读