zoukankan      html  css  js  c++  java
  • Mantle 简单教程

    Mantle可以很方便的去书写一个模型层的代码。

    使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议)

    使用一个解释器MTLJSONAdapter去转换模型对象。

    NSError *error = nil;
    MyObject *myObject = [MTLJSONAdapter modelOfClass:MyObject.class fromJSONDictionary:JSONDictionary error:&error];  //把JSONDictionary转换为模型对象
    
    NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:myObject];   //将模型对象转为JSON字典
    

    +JSONKeyPathsByPropertyKey

    这个方法返回一个字典,指定着你的模型对象和JSON中关键字的映射关系。

    一个例子:

    @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
    

    当我们用字典反序列化的时候

    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:

    实现这个方法去用一个不一样的类型转换器去转化属性

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

    对于一些值的转换:

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

    +classForParsingJSONDictionary:

    如果定义了一个类簇,可以实现这个方法去转换。

    @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
    

    使用

    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归档这个模型对象。

  • 相关阅读:
    UML各种图总结
    信息系统安全等级保护基本要求
    MySQL InnoDB表空间加密
    服务器常见操作问题
    公众号-接口配置信息 接口实现 netcore
    某些时候命令绑定可能会存在刷新不及时,往往需要点击一次程序才能激活,特此记录下解决方案
    c#几种场景获取程序运行目录
    wpf 控件绑定鼠标命令、键盘命令
    并发特别高的时候,随机数的种子生成
    mongodb占用大量内存
  • 原文地址:https://www.cnblogs.com/holyenzou/p/3985833.html
Copyright © 2011-2022 走看看