美文网首页
iOS 第三方库Mantle学习

iOS 第三方库Mantle学习

作者: 黑羽肃霜 | 来源:发表于2017-11-01 15:39 被阅读38次

    吐槽

    不吐不快
    这玩意儿相比起MJExtension来说难用至极.
    首先要添加JSON中的key与property名称的映射
    接着还要将所有的property名字加上一个JSONTransformer的后缀,去实现一个协议方法,复杂的要死.

    无奈公司已经封装了这一套,不得不花点时间来学习下

    步骤

    假设一个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;//可能需要转化的类, 字符串转日期
    @property (nonatomic, copy, readonly) NSArray<ActivityTag*> *array;//数组类, 必须指定类型
    @end
    

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

    格式为: property名字:JSON key

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

    属性特殊需要作变形处理

    需要去实现一个类方法,在属性名后加一个JSONTransformer
    例如属性名为 state, 那么需要添加

    + (NSValueTransformer *)stateStatusTransformer

    出现以下几种情况时,需要添加 变形处理(JSONTransformer)

    • string 转 URL
    • 枚举类型,需要添加映射,将所有枚举值一一告知
    • 数组类性,需要告知数组内约束的类类型
    • 自定义类类型,需要告知自定义的类类型
    • 普通需求需要作特定转化的类
    • 需要对这个类做类型转化,比如字符串转日期

    下面一一来说明

    -- string转URL

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

    -- 枚举映射

    + (NSValueTransformer *)stateJSONTransformer {
        return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{
            @"open": @(GHIssueStateOpen),       //左边是JSON key,右侧是枚举中的实际值
            @"closed": @(GHIssueStateClosed)
        }];
    }
    

    -- 数组

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

    -- 自定义类

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

    -- 需要特殊转化, 字符串转日期

    + (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];
        }];
    }
    

    相关文章

      网友评论

          本文标题:iOS 第三方库Mantle学习

          本文链接:https://www.haomeiwen.com/subject/lmlgpxtx.html