Mantle使用

Mantle能夠很方便的去書寫一個模型層的代碼。atom

使用它能夠很方便的去反序列化JSON或者序列化爲JSON(須要在MTLModel子類中實現<MTLJSONSerializing>協議)url

使用一個解釋器MTLJSONAdapter去轉換模型對象。code

NSError *error = nil;
MyObject *myObject = [MTLJSONAdapter modelOfClass:MyObject.class fromJSONDictionary:JSONDictionary error:&error];  //把JSONDictionary轉換爲模型對象

NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:myObject];   //將模型對象轉爲JSON字典

+JSONKeyPathsByPropertyKey

這個方法返回一個字典,指定着你的模型對象和JSON中關鍵字的映射關係。orm

一個例子:對象

@interface XYUser : MTLModel

@property (readonly, nonatomic, copy) NSString *name;
@property (readonly, nonatomic, strong) NSDate *createdAt;

@property (readonly, nonatomic, assign, getter = isMeUser) BOOL meUser;

@end

@implementation XYUser

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        @"createdAt": @"created_at",   //這裏表明createdAt屬性映射JSON中的created_at關鍵字
        @"meUser": NSNull.null        //meUser不會從JSON中反序列化
    };
}

@end

當咱們用字典反序列化的時候get

NSDictionary *JSONDictionary = @{
    @"name": @"john",
    @"created_at": @"2013/07/02 16:40:00 +0000",
    @"plan": @"lite"
};

XYUser *user = [MTLJSONAdapter modelOfClass:XYUser.class fromJSONDictionary:JSONDictionary error:&error];

//user中的name爲john  createdAt爲2013/07/02 16:40:00 +0000 meUser爲0 plan將會被忽略

+JSONTransformerForKey:

實現這個方法去用一個不同的類型轉換器去轉化屬性string

+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key {
    if ([key isEqualToString:@"createdAt"]) {
        return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName];
    }
    return nil;
}

對於一些值的轉換:it

+ (NSValueTransformer *)createdAtJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) {
        return [self.dateFormatter dateFromString:str];
    } reverseBlock:^(NSDate *date) {
        return [self.dateFormatter stringFromDate:date];
    }];
}

+classForParsingJSONDictionary:

若是定義了一個類簇,能夠實現這個方法去轉換。io

@interface XYMessage : MTLModel

@end

@interface XYTextMessage: XYMessage

@property (readonly, nonatomic, copy) NSString *body;

@end

@interface XYPictureMessage : XYMessage

@property (readonly, nonatomic, strong) NSURL *imageURL;

@end

@implementation XYMessage

+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary {
    if (JSONDictionary[@"image_url"] != nil) {
        return XYPictureMessage.class;
    }

    if (JSONDictionary[@"body"] != nil) {
        return XYTextMessage.class;
    }

    NSAssert(NO, @"No matching class for the JSON dictionary '%@'.", JSONDictionary);
    return self;
}

@end

使用form

NSDictionary *textMessage = @{
    @"id": @1,
    @"body": @"Hello World!"
};

NSDictionary *pictureMessage = @{
    @"id": @2,
    @"image_url": @"http://example.com/lolcat.gif"
};

XYTextMessage *messageA = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:textMessage error:NULL];

XYPictureMessage *messageB = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:pictureMessage error:NULL];

數據的持久化

MTLModel已經遵循了<NSCoding>協議,因此能夠NSKeyedArchiver歸檔這個模型對象。

相關文章
相關標籤/搜索