YYKit_YYModel

YYModel使用

YYKit_YYModel_第1张图片
image

1.自定义属性映射

+ (nullable NSDictionary *)modelCustomPropertyMapper;

例子:

//自定义类的属性
@property NSString      *name;
@property NSInteger     page;
@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 UInt64        uid;
@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)   NSUInteger      age;
@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_第2张图片
image
//更改后json
{
"name":"Jeff",
"age":"26",
"sex":"Woman",
"wifeName":"ZQY"
}
YYKit_YYModel_第3张图片
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_第4张图片
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_第5张图片
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_第6张图片
image

你可能感兴趣的:(YYKit_YYModel)