iOS 第三方庫Mantle學(xué)習(xí)

吐槽

不吐不快
這玩意兒相比起MJExtension來說難用至極.
首先要添加JSON中的key與property名稱的映射
接著還要將所有的property名字加上一個JSONTransformer的后綴,去實現(xiàn)一個協(xié)議方法,復(fù)雜的要死.

無奈公司已經(jīng)封裝了這一套,不得不花點時間來學(xué)習(xí)下

步驟

假設(shè)一個DIY類

typedef enum : NSUInteger {
    GHIssueStateOpen,
    GHIssueStateClosed
} GHIssueState;

@interface DIY : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSURL *URL;
@property (nonatomic, assign, readonly) GHIssueState state; //枚舉類
@property (nonatomic, copy, readonly) NSString *reporterLogin;//普通類
@property (nonatomic, strong, readonly) GHUser *assignee;//自定義類
@property (nonatomic, copy, readonly) NSDate *updatedAt;//可能需要轉(zhuǎn)化的類, 字符串轉(zhuǎn)日期
@property (nonatomic, copy, readonly) NSArray<ActivityTag*> *array;//數(shù)組類, 必須指定類型
@end

先添加映射,JSON <==> properties

格式為: property名字:JSON key

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        @"URL": @"url",
        @"state": @"state",
        @"reporterLogin": @"login",
        @"assignee": @"assignee",
        @"updatedAt": @"updated_at"
        @"array":@"infos"
    };
}

屬性特殊需要作變形處理

需要去實現(xiàn)一個類方法,在屬性名后加一個JSONTransformer
例如屬性名為 state, 那么需要添加

+ (NSValueTransformer *)stateStatusTransformer

出現(xiàn)以下幾種情況時,需要添加 變形處理(JSONTransformer)

  • string 轉(zhuǎn) URL
  • 枚舉類型,需要添加映射,將所有枚舉值一一告知
  • 數(shù)組類性,需要告知數(shù)組內(nèi)約束的類類型
  • 自定義類類型,需要告知自定義的類類型
  • 普通需求需要作特定轉(zhuǎn)化的類
  • 需要對這個類做類型轉(zhuǎn)化,比如字符串轉(zhuǎn)日期

下面一一來說明

-- string轉(zhuǎn)URL

+ (NSValueTransformer *)URLJSONTransformer {
    return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}

-- 枚舉映射

+ (NSValueTransformer *)stateJSONTransformer {
    return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{
        @"open": @(GHIssueStateOpen),       //左邊是JSON key,右側(cè)是枚舉中的實際值
        @"closed": @(GHIssueStateClosed)
    }];
}

-- 數(shù)組

+ (NSValueTransformer *)arrayJSONTransformer {
    return [MTLJSONAdapter arrayTransformerWithModelClass:[ActivityTag class]];
}

-- 自定義類

+ (NSValueTransformer *)assigneeJSONTransformer {
    return [MTLJSONAdapter dictionaryTransformerWithModelClass:GHUser.class];
}

-- 需要特殊轉(zhuǎn)化, 字符串轉(zhuǎn)日期

+ (NSDateFormatter *)dateFormatter {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
    return dateFormatter;
}

+ (NSValueTransformer *)updatedAtJSONTransformer {
    return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) {
        return [self.dateFormatter dateFromString:dateString];
    } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {
        return [self.dateFormatter stringFromDate:date];
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 總想寫點什么,畢竟這一段時間的睡眠都不太好,心里總是充滿怨氣,現(xiàn)在才發(fā)現(xiàn)這個事情給我?guī)淼膫ΑN胰松能壽E并非一...
    你不應(yīng)該太帥啊閱讀 229評論 0 0
  • doctest非常有用,不但可以用來測試,還可以直接作為示例代碼。通過某些文檔生成工具,就可以自動把包含docte...
    徐子鑑閱讀 325評論 0 0