日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

序列化框架MJExtension详解 + iOS ORM框架

發(fā)布時(shí)間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列化框架MJExtension详解 + iOS ORM框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)開發(fā)中你的模型中屬性名稱和 字典(JSON/XML) 中的key 不能一一對(duì)應(yīng)時(shí), 或者當(dāng)字典中嵌套了多層字典數(shù)組時(shí)..., 以及教你如何用 MJExtension 配置類來統(tǒng)一管理你的模型配置, 下面羅列了開發(fā)中常見的一些特殊情況, 請(qǐng)參考!(MJExtension/github)

  • 最基本用法: // 將字典轉(zhuǎn)為模型 Person *p = [Person mj_objectWithKeyValues:dict2]; // 將 plist數(shù)據(jù)轉(zhuǎn)成模型數(shù)組 NSArrar *models = [Person mj_objectArrayWithFile:@"xx.plist"]; // 將字典數(shù)組轉(zhuǎn)成模型數(shù)組, 最常用 NSArrar *models = [Person mj_objectArrayWithKeyValuesArray:dict]

    ?

  • 1 . 屬性名和關(guān)鍵字沖突, 我們需要變更屬性名, 比如 JSON 里是 id, 我們最好不要用 id, 又比如 discription, 和系統(tǒng)類重名了

    ?

    NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai"}; 這時(shí)候我們屬性就不能命名 id, description 了, 得換一個(gè) // person.h @interface Person : NSObject @property(nonatomic, strong) NSString * name; @property(nonatomic, assign) NSInteger age; @property(nonatomic, strong) NSString * descrip; @property(nonatomic, strong) NSString *ID;@end光換名字不行, 我們得把換的名字和字典中的 key聯(lián)系起來, 不然轉(zhuǎn)換成模型后, 屬性是沒有值得MJExtension 提供了一個(gè)+ mj_replacedKeyFromPropertyName的方法(該方法在模型中使用), 可以把原來字典中的 key 和你修改后的屬性再關(guān)聯(lián)起來, 你只要告訴它, 想把什么屬性名替換為原來的那個(gè) key // person.m + (NSDictionary *)mj_replacedKeyFromPropertyName {return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",}; }

    2 . 字典中又嵌套了一層字典, 示例中的 address, 同時(shí)你只需要其中的某一個(gè)屬性, 沒必要再單獨(dú)搞個(gè)模型來轉(zhuǎn), 你就可以這么做:

    • 注意如果單獨(dú)搞個(gè)模型對(duì)應(yīng)這個(gè)字典, MJExtension 是會(huì)自動(dòng)將字典轉(zhuǎn)成模型的, 只有當(dāng)是字典數(shù)組時(shí)(字典數(shù)組嵌套字典數(shù)組才需要其它操作, 參考第4條)
    • NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai",@"address":@{@"province":@"chaohu"},};

      還是在mj_replacedKeyFromPropertyName中關(guān)聯(lián), 你只需要將 key 用.連接起來就行了

    • // person.m + (NSDictionary *)mj_replacedKeyFromPropertyName {return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",@"address":@"address.province"}; }

      假如 address key 對(duì)應(yīng)的字典中有很多key,而且嵌套比較深, 不過你僅僅只是想要一個(gè)數(shù)據(jù), 你還是不想單獨(dú)搞個(gè)模型, 你就還是可以點(diǎn)下去, 比如說下面更復(fù)雜的情況, 你只想取出里面狗的名字

      NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai",@"address":@{@"province":@"chaohu",@"school":@"sitanfu",@"family":@[@"mm", @"dd", @{@"dog":@"wangcai"}],},};+ (NSDictionary *)mj_replacedKeyFromPropertyName {return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description", // @"address":@"address.province",@"dogName":@"address.family[2].dog",}; } 3 . 可能一些變態(tài)的公司一定要讓你用駝峰命名, 但服務(wù)器返回的數(shù)據(jù)又都是該死的下劃線, 你該怎么辦, 別怕, 叔叔教你不用在上一個(gè)方法里一個(gè)一個(gè)對(duì)應(yīng)著改...
      這里要用到 + mj_replacedKeyFromPropertyName121這個(gè)方法, 121, 代表 oneToOne...MJ 說的...

      NSDictionary *dict2 = @{@"name_key":@"xiaoming",@"age_key":@20,@"info_key":@"handsome",};// person.h @property(nonatomic, strong) NSString * nameKey; @property(nonatomic, strong) NSString * infoKey; @property(nonatomic, assign) NSInteger ageKey;// person.m + (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName {// propertyName 是你屬性名, 你把屬性名格式化成對(duì)應(yīng)字典中 key, 返回就可以了 NSMutableString *key = [NSMutableString string];// 遍歷propertyName的所有字符for (NSInteger i = 0; i < propertyName.length; i++) {unichar c = [propertyName characterAtIndex:i];if (c >= 'A' && c <= 'Z') { // 大寫字母[key appendFormat:@"_%c", c + ('a' - 'A')];} else { // 非大寫字母[key appendFormat:@"%c", c];}}return key; // 其實(shí) MJ的框架里已經(jīng)實(shí)現(xiàn)了這個(gè)方法, 你只需一句代碼:請(qǐng)跟著我心中默默念一句: 臥槽... // return [propertyName mj_underlineFromCamel]; }

      4 . 當(dāng)字典中又包含字典數(shù)組時(shí), 模型嵌套, 你要告訴 MJExtension 嵌套模型的類名
      還是先講在模型類中的做法:

      NSDictionary *dict2 = @{@"name_key":@"xiaoming",@"age_key":@20,@"info_key":@"handsome",@"users": @[@{@"name":@"xx"}, @{@"name":@"yy"}, @{@"name":@"zz"}],};@property(nonatomic, strong) NSString * nameKey; @property(nonatomic, strong) NSString * infoKey; @property(nonatomic, assign) NSInteger ageKey; @property(nonatomic, strong) NSArray * users;// person.m + (NSDictionary *)mj_objectClassInArray {return @{@"users":@"User",// 或者 // @"users":[User class], }; }

      5 . 前面都是些常規(guī)用法, 下面開始裝逼...
      所謂高級(jí)用法其實(shí)就是嚴(yán)密的邏輯加科學(xué)的管理(抽抽抽!!!)加牛逼的架構(gòu)加首席科學(xué)家的思想云云...不扯了...

      恩恩..

      以上所有操作都是在我們的模型里面完成的, 這樣就對(duì)模型造成了一定的污染, 下次我們代碼萬一不用 MJExtension 了, 那這些模型就都不能用了, 那就哭吧...所以大神 MJ 早就給我們做好了一切, 然后一群菜狗們屁顛屁顛拿來裝逼了, 比如本人...

      以上的所有操作都可以不用再模型中操作, 我們可以拿出來放在外面, 比如某個(gè) viewController 里面統(tǒng)一設(shè)置

      例子2中這么寫, 方法名差不多,只不過換成了 block 回調(diào)

      // 例子 2.[Person mj_setupReplacedKeyFromPropertyName:^NSDictionary *{return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",// @"address":@"address.province",@"dogName":@"address.family[2].dog",};}]; // 例子 3.[Person mj_setupReplacedKeyFromPropertyName121:^NSString *(NSString *propertyName) {// propertyName 是你屬性名, 你把屬性名格式化成對(duì)應(yīng)字典中 key, 返回就可以了 NSMutableString *key = [NSMutableString string];// 遍歷propertyName的所有字符for (NSInteger i = 0; i < propertyName.length; i++) {unichar c = [propertyName characterAtIndex:i];if (c >= 'A' && c <= 'Z') { // 大寫字母[key appendFormat:@"_%c", c + ('a' - 'A')];} else { // 非大寫字母[key appendFormat:@"%c", c];}}return key; // 其實(shí) MJ的框架里已經(jīng)實(shí)現(xiàn)了這個(gè)方法, 你只需一句代碼:請(qǐng)跟著我心中默默念一句: 臥槽... // return [propertyName mj_underlineFromCamel];}]; // 例子 4.[Person mj_setupObjectClassInArray:^NSDictionary *{return @{@"users":@"User",// 或者// @"users":[User class], };}]; 別急, 還沒完, 下面來電思想層面的雞湯...沒發(fā)現(xiàn)其實(shí)這些其實(shí)都是一次性的設(shè)置嗎, 開發(fā)中我們這樣的配置會(huì)十分平凡, 感覺上是不是很想抽的沖動(dòng)...這一堆東西寫在控制器里, 而且不一定只是一個(gè)控制器, 好多控制器都會(huì)有, 只要你需要轉(zhuǎn)模型...那怎么抽呢, 其實(shí)你發(fā)現(xiàn)沒, 這和我們經(jīng)常會(huì)抽一個(gè)專門管理常量的的類的做法, 是不是很類似, 這里我們也是這個(gè)需求所以我們單獨(dú)抽一個(gè)專門配置模型的 MJExtensionConfig類來管理這些配置, 這樣不是方便許多嗎!!!!所以我們將上面的那些配置統(tǒng)統(tǒng)拿到我們的配置類中放到哪兒最合適, 當(dāng)然是 + load中嘍 別急, 還沒完, 下面來電思想層面的雞湯...沒發(fā)現(xiàn)其實(shí)這些其實(shí)都是一次性的設(shè)置嗎, 開發(fā)中我們這樣的配置會(huì)十分平凡, 感覺上是不是很想抽的沖動(dòng)...這一堆東西寫在控制器里, 而且不一定只是一個(gè)控制器, 好多控制器都會(huì)有, 只要你需要轉(zhuǎn)模型...那怎么抽呢, 其實(shí)你發(fā)現(xiàn)沒, 這和我們經(jīng)常會(huì)抽一個(gè)專門管理常量的的類的做法, 是不是很類似, 這里我們也是這個(gè)需求所以我們單獨(dú)抽一個(gè)專門配置模型的 MJExtensionConfig類來管理這些配置, 這樣不是方便許多嗎!!!!所以我們將上面的那些配置統(tǒng)統(tǒng)拿到我們的配置類中放到哪兒最合適, 當(dāng)然是 + load中嘍 從如下轉(zhuǎn)載:https://www.jianshu.com/p/11a8e15f7d2b

轉(zhuǎn)載于:https://www.cnblogs.com/edensyd/p/9139025.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的序列化框架MJExtension详解 + iOS ORM框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。