iOS 第三方库Mantle学习

吐槽

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

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

步骤

假设一个DIY类

typedef enum : NSUInteger {
    GHIssueStateOpen,
    GHIssueStateClosed
} GHIssueState;

@interface DIY : MTLModel 
@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 *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学习)