YYModel使用總結(jié)

YYModel使用總結(jié)

高性能 iOS/OSX 模型轉(zhuǎn)換框架
該項目是 YYKit 組件之一

性能

處理 GithubUser 數(shù)據(jù) 10000 次耗時統(tǒng)計 (iPhone 6):

特性

  • 高性能: 模型轉(zhuǎn)換性能接近手寫解析代碼奕污。
  • 自動類型轉(zhuǎn)換: 對象類型可以自動轉(zhuǎn)換,詳情見下方表格征冷。
  • 類型安全: 轉(zhuǎn)換過程中国拇,所有的數(shù)據(jù)類型都會被檢測一遍黍瞧,以保證類型安全躬翁,避免崩潰問題昧旨。
  • 無侵入性: 模型無需繼承自其他基類拜轨。
  • 輕量: 該框架只有 5 個文件 (包括.h文件)抽减。
  • 文檔和單元測試: 文檔覆蓋率100%, 代碼覆蓋率99.6%。

使用方法

簡單的 Model 與 JSON 相互轉(zhuǎn)換

    // 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) 轉(zhuǎn)換為 Model:
    User *user = [User yy_modelWithJSON:json];
    
    // 將 Model 轉(zhuǎn)換為 JSON 對象:
    NSDictionary *json = [user yy_modelToJSONObject];

當(dāng) JSON/Dictionary 中的對象類型與 Model 屬性不一致時橄碾,YYModel將會進行如下自動轉(zhuǎn)換卵沉。自動轉(zhuǎn)換不支持的值將會被忽略颠锉,以免各種潛在的崩潰問題

JSON/Dictionary Model
NSString NSNumber,NSURL,SEL,Class
NSNumber NSString
NSString/NSNumber 基礎(chǔ)類型 (BOOL,int,float,NSUInteger,UInt64,...) NaN和Inf 會被忽略
NSString NSDate 以下列格式解析:
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd'T'HH:mm:ss
yyyy-MM-dd'T'HH:mm:ssZ
EEE MMM dd HH:mm:ss Z yyyy
NSDate NSString 格式化為 ISO8601:
"YYYY-MM-dd'T'HH:mm:ssZ"
NSValue struct (CGRect,CGSize,...)
NSNull nil,0
"no","false",... @(NO),0
"yes","true",... @(YES),1

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) 映射到一個或多個屬性琼掠。如果一個屬性沒有映射關(guān)系,那默認(rèn)會使用相同屬性名作為映射停撞。

在 json->model 的過程中:如果一個屬性對應(yīng)了多個 json key瓷蛙,那么轉(zhuǎn)換過程會按順序查找,并使用第一個不為空的值戈毒。

在 model->json 的過程中:如果一個屬性對應(yīng)了多個 json key (key path)艰猬,那么轉(zhuǎn)換過程僅會處理第一個 json key (key path);如果多個屬性對應(yīng)了同一個 json key埋市,則轉(zhuǎn)換過過程會使用其中任意一個不為空的值姥宝。

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什么都不用做,如果屬性名不對應(yīng)恐疲,也要實現(xiàn)映射的方法 “+ (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
    
    // 返回容器類中的所需要存放的數(shù)據(jù)類型 (以 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
    // 如果實現(xiàn)了該方法,則處理過程中會忽略該列表內(nèi)的所有屬性
    + (NSArray *)modelPropertyBlacklist {
        return @[@"test1", @"test2"];
    }
    // 如果實現(xiàn)了該方法培己,則處理過程中不會處理該列表外的屬性碳蛋。
    + (NSArray *)modelPropertyWhitelist {
        return @[@"name"];
    }
    @end

數(shù)據(jù)校驗與自定義轉(zhuǎn)換

    // JSON:
    {
        "name":"Harry",
        "timestamp" : 1445534567
    }
    
    // Model:
    @interface User
    @property NSString *name;
    @property NSDate *createdAt;
    @end
    
    @implementation User
    // 當(dāng) JSON 轉(zhuǎn)為 Model 完成后,該方法會被調(diào)用省咨。
    // 你可以在這里對數(shù)據(jù)進行校驗肃弟,如果校驗不通過,可以返回 NO零蓉,則該 Model 會被忽略笤受。
    // 你也可以在這里做一些自動轉(zhuǎn)換不能完成的工作。
    - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
        NSNumber *timestamp = dic[@"timestamp"];
        if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
        _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
        return YES;
    }
    
    // 當(dāng) Model 轉(zhuǎn)為 JSON 完成后敌蜂,該方法會被調(diào)用箩兽。
    // 你可以在這里對數(shù)據(jù)進行校驗,如果校驗不通過章喉,可以返回 NO汗贫,則該 Model 會被忽略。
    // 你也可以在這里做一些自動轉(zhuǎn)換不能完成的工作秸脱。
    - (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {
        if (!_createdAt) return NO;
        dic[@"timestamp"] = @(n.timeIntervalSince1970);
        return YES;
    }
    @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 = [super init]; 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

  1. 在 Podfile 中添加 pod 'YYModel'落包。
  2. 執(zhí)行 pod install 或 pod update。
  3. 導(dǎo)入 <YYModel/YYModel.h>摊唇。

Carthage

  1. 在 Cartfile 中添加 github "ibireme/YYModel"咐蝇。
  2. 執(zhí)行 carthage update --platform ios 并將生成的 framework 添加到你的工程。
  3. 導(dǎo)入 <YYModel/YYModel.h>巷查。

手動安裝

  1. 下載 YYModel 文件夾內(nèi)的所有內(nèi)容有序。
  2. 將 YYModel 內(nèi)的源文件添加(拖放)到你的工程抹腿。
  3. 導(dǎo)入 YYModel.h。

文檔

你可以在 CocoaDocs 查看在線 API 文檔笔呀,也可以用 appledoc 本地生成文檔幢踏。

系統(tǒng)要求

該項目最低支持 iOS 6.0 和 Xcode 7.0。

許可證

YYModel 使用 MIT 許可證许师,詳情見 LICENSE 文件房蝉。

github原文地址

https://github.com/ibireme/YYModel#codingcopyinghashequaldescription-1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市微渠,隨后出現(xiàn)的幾起案子搭幻,更是在濱河造成了極大的恐慌,老刑警劉巖逞盆,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檀蹋,死亡現(xiàn)場離奇詭異,居然都是意外死亡云芦,警方通過查閱死者的電腦和手機俯逾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舅逸,“玉大人桌肴,你說我怎么就攤上這事×鹄” “怎么了坠七?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旗笔。 經(jīng)常有香客問我彪置,道長,這世上最難降的妖魔是什么蝇恶? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任拳魁,我火速辦了婚禮,結(jié)果婚禮上艘包,老公的妹妹穿的比我還像新娘的猛。我一直安慰自己,他們只是感情好想虎,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叛拷,像睡著了一般舌厨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿薇,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天裙椭,我揣著相機與錄音躏哩,去河邊找鬼。 笑死揉燃,一個胖子當(dāng)著我的面吹牛扫尺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炊汤,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼正驻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抢腐?” 一聲冷哼從身側(cè)響起姑曙,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迈倍,沒想到半個月后伤靠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡啼染,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年宴合,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹鹅。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卦洽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徒欣,到底是詐尸還是另有隱情逐样,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布打肝,位于F島的核電站脂新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粗梭。R本人自食惡果不足惜争便,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望断医。 院中可真熱鬧滞乙,春花似錦、人聲如沸鉴嗤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醉锅。三九已至兔簇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垄琐。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工边酒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狸窘。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓墩朦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翻擒。 傳聞我的和親對象是個殘疾皇子氓涣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)韭寸,斷路器春哨,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 如何集成? 支持CocoaPods恩伺,在 Podfile 中添加 pod 'YYModel'赴背。 支持Carthage...
    勇往直前888閱讀 10,964評論 0 7
  • 概述 ? iOS源碼解析—YYModel(YYClassInfo)分析了如何根據(jù)OC的Class對象構(gòu)建...
    egoCogito_panf閱讀 11,531評論 4 32
  • 特朗普在競選之前,曾對教育部的存在有質(zhì)疑晶渠,并且揚言做總統(tǒng)之后要廢掉教育部凰荚。 美國教育部的前身是1868年成立的美國...
    拾幾時閱讀 772評論 2 0
  • 晚生愚鈍,年過三旬褒脯,尚未開悟便瑟,苦讀數(shù)載,幾易春秋番川,仍不得智到涂,彷徨之余,憋出拙齒兩顆颁督! 怎奈二牙長勢歪斜践啄,隨心而欲,...
    板泉后溪閱讀 358評論 0 1