【Objective-c】 YYModel 基本使用

本編內(nèi)容均出自于:張羽婷_Laura

聽朋友介紹,YYModel是一位90年后用周末兩天的時(shí)間搭建完成的一套框架,今天學(xué)習(xí)了一下午,收獲不少,滿滿的驚喜,作者思緒很縝密,不得不佩服...

#import "ViewController.h"
#import "YYModel.h"
#import "Book.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSDictionary *dict = @{
        @"n":@"Harry Pottery",
        @"p": @(256),
        @"ext" : @{
                    @"desc" : @"A book written by J.K.Rowing."
                },
        @"ID" : @(100010),
        @"author":@{
            @"name":@"J.K.Rowling",
            @"birthday":@"1965-07-31T00:00:00+0000"
        },
        @"works":@[@"one",@"two",@"three"],
        @"timestamp":@(1445534567)
        };
    
    //單模型,或者模型嵌套,都是只要一句代碼,會自動嵌套
    Book *model = [[Book alloc]init];
    [model yy_modelSetWithDictionary:dict];
    NSLog(@"===============%@",model.name);
    NSLog(@"+++++++++++++++%ld",model.page);
    NSLog(@"--------------%@",model.author.name);       //模型嵌套
}
#import "Book.h"
@implementation Book
/*
    創(chuàng)建一個(gè)JSON的Key 與 Model屬性的映射列表
    可以一對多、多對一、多對多
    1、如果一個(gè)屬性沒有映射關(guān)系,那默認(rèn)會使用相同屬性名作為映射
    2、在 json->model 的過程中:如果一個(gè)屬性對應(yīng)了多個(gè) json key,那么轉(zhuǎn)換過程會按順序查找,并使用第一個(gè)不為空的值。
    3、在 model->json 的過程中:如果一個(gè)屬性對應(yīng)了多個(gè) json key (key path),那么轉(zhuǎn)換過程僅會處理第一個(gè) json key (key path);如果多個(gè)屬性對應(yīng)了同一個(gè) json key,則轉(zhuǎn)換過過程會使用其中任意一個(gè)不為空的值。
 */

//返回一個(gè) Dict,將 Model 屬性名對映射到 JSON 的 Key。
//創(chuàng)建映射表,主要是因?yàn)镴SON的Key與Model的屬性明不一致
+ (NSDictionary *)modelCustomPropertyMapper {
    return @{@"name" : @"n",
             @"page" : @"p",
             @"desc" : @"ext.desc",
             @"bookID" : @[@"id",@"ID",@"book_id"],
             };
}

//返回容器類中的所需存放的數(shù)據(jù)類型(以Class或 Class Name 的形式)
+ (NSDictionary *)modelContainerPropertyGenericClass{
    return @{
             @"works":[NSString class], //聲明數(shù)組works中的元素都是字符串類型
             };
}

//黑名單:在處理過程中會忽略該列表內(nèi)的所有屬性
+ (NSArray *)modelPropertyBlacklist{
    //結(jié)果是:name屬性不會被賦值,其他正常
    return @[@"name"];
}

//白名單: 在處理過程中不會處理該列表以外的屬性
+ (NSArray *)modelPropertyWhitelist{
    //結(jié)果是:只會給name屬性賦值
    return @[@"name"];
}

//當(dāng)JSON 轉(zhuǎn)為 Model 完成后,該方法會被調(diào)用
//可以在這里對數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)不通過,可以返回NO,則該Model會被忽略
//也可以在這里對一些自動轉(zhuǎn)換不能完成的工作,如數(shù)據(jù)格式更改
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic{
    NSNumber *timestamp = dic[@"timestamp"];
    if (![timestamp isKindOfClass:[NSNumber class]]) {
        return NO;
    }
    //數(shù)據(jù)轉(zhuǎn)換
    _timestamp = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
    return YES;
}

//當(dāng)Model 轉(zhuǎn)為 JSON 完成后,該方法會被調(diào)用
//可以在這里對數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)不通過,可以返回NO,則該Model 會被忽略
//也可以在這里做一些自動轉(zhuǎn)換不能完成的工作
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic{
    return YES;
}

以上是部分代碼,完整的DEMO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容