Mantle 简单教程

系统 1425 0

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

Mantle 简单教程


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论