美文网首页
YYKit_YYModel

YYKit_YYModel

作者: Iris_Fighting | 来源:发表于2018-04-02 16:02 被阅读144次

    YYModel使用

    image

    1.自定义属性映射

    + (nullable NSDictionary<NSString *, id> *)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<NSString *, id> *)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<YYAuthor *>    *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<NSString *> *)modelPropertyBlacklist; 黑名单
    + (nullable NSArray<NSString *> *)modelPropertyWhitelist;; 白名单
    
    这两个比较简单。
    黑名单,故名思议,黑名单中的属性不会参与字典转模型。
    白名单使用比较极端,你用了之后,只有白名单中的属性会参与字典转模型,其他属性都不参与。不推荐使用。
    

    5.更改字典信息

    该方法发生在字典转模型之前。 最后对网络字典做一次处理。
    - (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;

    .h文件
    #import <Foundation/Foundation.h>
    
    /*
     {
     "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 <YYModel.h>
    
    @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"
    }
    
    image
    //更改后json
    {
    "name":"Jeff",
    "age":"26",
    "sex":"Woman",
    "wifeName":"ZQY"
    }
    
    image

    6.字典转模型补充

    - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;

    #import <Foundation/Foundation.h>
    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 <YYModel.h>
    
    @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);
        
    
    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);
    
    }
    

    结果如图:


    image

    8.字典用法和数组的用法

    + (nullable NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json;
    + (nullable NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json;

    模型

    #import <Foundation/Foundation.h>
    
    /*
     [{"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);
    

    结果如图:


    image

    相关文章

      网友评论

          本文标题:YYKit_YYModel

          本文链接:https://www.haomeiwen.com/subject/kyrxhftx.html