YYModel的简介与使用

来源:互联网 发布:金蝶k3软件 编辑:程序博客网 时间:2024/05/21 16:04

关于YYModel的性能,一张图带你看懂


特性:

高性能: 模型转换性能接近手写解析代码。
自动类型转换: 对象类型可以自动转换,详情见下方表格。
类型安全: 转换过程中,所有的数据类型都会被检测一遍,以保证类型安全,避免崩溃问题。
无侵入性: 模型无需继承自其他基类。
轻量: 该框架只有 5 个文件 (包括.h文件)。
文档和单元测试: 文档覆盖率100%, 代码覆盖率99.6%。

使用方法:

简单的 Model 与 JSON 相互转换

// JSON:

{

    "uid":123456,

    "name":"Harry",

    "created":"1965-07-31T00:00:00+0000"

}


// Model:

@interface User : NSObject

@property UInt64 uid;

@property NSString *name;

@property NSDate *created;

@end

@implementation User

@end



// JSON (NSData,NSString,NSDictionary)转换为 Model:

User *user = [User yy_modelWithJSON:json];


// Model转换为 JSON对象:

NSDictionary *json = [user yy_modelToJSONObject];


当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel将会进行如下自动转换。自动转换不支持的值将会被忽略,以免各种潜在的崩溃问题.



Model 属性名和 JSON 中的 Key 不相同:

// JSON:

{

    "n":"Harry Pottery",

    "p": 256,

    "ext" : {

        "desc" :"A book written by J.K.Rowing."

    },

    "ID" :100010

}


// Model:

@interface Book : NSObject

@property NSString *name;

@property NSInteger page;

@property NSString *desc;

@property NSString *bookID;

@end

@implementation Book

//返回一个 Dict,将 Model属性名对映射到 JSON Key

+ (NSDictionary *)modelCustomPropertyMapper {

    return@{@"name" :@"n",

             @"page" :@"p",

             @"desc" :@"ext.desc",

             @"bookID" :@[@"id",@"ID",@"book_id"]};

}

@end



你可以把一个或一组 json key (key path) 映射到一个或多个属性。如果一个属性没有映射关系,那默认会使用相同属性名作为映射。

在 json->model 的过程中:如果一个属性对应了多个 json key,那么转换过程会按顺序查找,并使用第一个不为空的值。

在 model->json 的过程中:如果一个属性对应了多个 json key (key path),那么转换过程仅会处理第一个 json key (key path);如果多个属性对应了同一个 json key,则转换过过程会使用其中任意一个不为空的值。

Model 包含其他 Model:

// JSON

{

    "author":{

        "name":"J.K.Rowling",

        "birthday":"1965-07-31T00:00:00+0000"

    },

    "name":"Harry Potter",

    "pages":256

}


// Model

@interface Book : NSObject

@property NSString *name;

@property NSUInteger pages;

@property Author *author;//Book包含 Author属性

@end

@implementation Book

@end


//被包含的Model什么都不用做,如果属性名不对应,也要实现映射的方法 “+ (NSDictionary *)modelCustomPropertyMapper”

@interface Author : NSObject

@property NSString *name;

@property NSDate *birthday;

@end

@implementation Author

@end



容器类属性:

@class Shadow,Border,Attachment;


@interface Attributes

@property NSString *name;

@property NSArray *shadows;//Array<Shadow>

@property NSSet *borders;//Set<Border>

@property NSMutableDictionary *attachments;//Dict<NSString,Attachment>

@end


@implementation Attributes


// 返回容器类中的所需要存放的数据类型 ( Class Class Name的形式)

+ (NSDictionary *)modelContainerPropertyGenericClass {

    return@{@"shadows" : [Shadow class],

             @"borders" : Border.class,

             @"attachments" :@"Attachment"};

}

@end


黑名单 与 白名单:

@interface User

@property NSString *name;

@property NSUInteger age;

@end


@implementation Attributes

// 如果实现了该方法,则处理过程中会忽略该列表内的所有属性

+ (NSArray *)modelPropertyBlacklist {

    return@[@"test1",@"test2"];

}

// 如果实现了该方法,则处理过程中不会处理该列表外的属性。

+ (NSArray *)modelPropertyWhitelist {

    return@[@"name"];

}

@end


数据校验与自定义转换:

// JSON:

{

    "name":"Harry",

    "timestamp" :1445534567

}


// Model:

@interface User

@property NSString *name;

@property NSDate *createdAt;

@end


@implementation User

// JSON转为 Model完成后,该方法会被调用。

// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model会被忽略。

// 你也可以在这里做一些自动转换不能完成的工作。

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

    NSNumber *timestamp = dic[@"timestamp"];

    if (![timestampisKindOfClass:[NSNumberclass]])returnNO;

    _createdAt = [NSDatedateWithTimeIntervalSince1970:timestamp.floatValue];

    returnYES;

}


// Model转为 JSON完成后,该方法会被调用。

// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model会被忽略。

// 你也可以在这里做一些自动转换不能完成的工作。

- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {

    if (!_createdAt)returnNO;

    dic[@"timestamp"] =@(n.timeIntervalSince1970);

    returnYES;

}

@end


Coding/Copying/hash/equal/description:

@interface YYShadow :NSObject <NSCoding,NSCopying>

@property (nonatomic,copy)NSString *name;

@property (nonatomic,assign)CGSize size;

@end


@implementation YYShadow

// 直接添加以下代码即可自动完成

- (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }

- (id)initWithCoder:(NSCoder *)aDecoder {self = [superinit];return [self yy_modelInitWithCoder:aDecoder]; }

- (id)copyWithZone:(NSZone *)zone {return [self yy_modelCopy]; }

- (NSUInteger)hash {return [self yy_modelHash]; }

- (BOOL)isEqual:(id)object {return [self yy_modelIsEqual:object]; }

- (NSString *)description {return [self yy_modelDescription]; }

@end



安装:CocoaPods:在 Podfile 中添加 pod 'YYModel';执行 pod install 或 pod update;导入 <YYModel/YYModel.h>。





0 0