ios Mantle使用小记

先从Mantle github上下载下最新代码, (最近发现这个Mantle升级变化也挺大的,或许过一段时间, 这个文章记录的方法也不适用了)

1. 测试时, 可以使用下面这个网址及代码来测试, 里面有模型,数组,以及字典, 还可以有long long 转NSDate,  string 转 int等。

    NSURL *url = [NSURLURLWithString:@"http://api.openweathermap.org/data/2.5/weather?lat=37.785834&lon=-122.406417&units=imperial"];

    [NSURLConnectionsendAsynchronousRequest:[NSURLRequestrequestWithURL:url]

                                       queue:[NSOperationQueuemainQueue]

                           completionHandler:^(NSURLResponse* response,NSData* data, NSError* connectionError){

                               if (!connectionError) {

                                   NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:data

                                                                                       options:NSJSONReadingMutableContainers

                                                                                         error:nil];

                                   

                                   //JSON数据和Model的属性进行绑定

                                   FirstInterfaceModel *model = [MTLJSONAdaptermodelOfClass:[FirstInterfaceModelclass]

                                                                         fromJSONDictionary:dict

                                                                                      error:nil];

                                   NSLog(@"dict=%@\nmodel:%@",dict, model);

                                   

                                   NSError *testError =nil;

                                   NSDictionary *dicFromModel = [MTLJSONAdapterJSONDictionaryFromModel:model error:&testError];

                                   if (testError ==nil) {

                                       NSLog(@"after convert dic=%@", dicFromModel);

                                   }else {

                                       NSLog(@"after convert dic failed");

                                   }

                               }

                           }];


2. 使用时,需要把该模型有哪些属性值写清楚, 转的时候Mantle才知道哪些是需要转的。类型建议使用NSString, NSNumber, NSArray, NSDictionary, 等,不建议使用基本类型。

@interface FirstInterfaceModel :MTLModel <MTLJSONSerializing>


@property (nonatomic,strong) NSDate *date;

@property (nonatomic,strong) NSNumber *humidity;

@property (nonatomic,strong) NSNumber *temperature;

@property (nonatomic,strong) NSString *cod;

@property (nonatomic,strong) NSString *name;

@property (nonatomic,strong) NSString *xxxTestStr;

@property (nonatomic,strong) NSArray *arrWeathers;

@property (nonatomic,strong) sysModel *sys;

@end


3. 实现

+ (NSDictionary *)JSONKeyPathsByPropertyKey {

    NSMutableDictionary *mutDic = [[NSDictionarymtl_identityPropertyMapWithModel:[selfclass]] mutableCopy];

    [mutDic setObject:@"dt"forKey:@"date"];

    [mutDic setObject:@"main.humidity"forKey:@"humidity"];

    [mutDic setObject:@"main.temp"forKey:@"temperature"];

    [mutDic setObject:@"weather"forKey:@"arrWeathers"];

    

    return mutDic;

}

上面这个方法, 可以把服务器返回的字段与当前的属性名比较,如果相同,则直接使用,如果不相同的, 则与mutDic中的value进行比较, 然后转换成对应key的属性值。


4. 如果上面的服务器返回的cod为整弄,205这样的数据, 但我们这里定义的属性值为NSString, 则就需要下面这样的方式来进行转换,注意下面这个方法是双向转换。

+ (NSValueTransformer *)codJSONTransformer {

    return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

        NSNumber *num = value;

        NSString *tempStr = [NSStringstringWithFormat:@"%@", num];

        return tempStr;

    } reverseBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

        NSString *tempStr = value;

        NSNumber *tempNum = @(tempStr.integerValue);

        return tempNum;

    }];

}

再附一个服务器返回的dt为一个long long整型,这里需要一个NSDate.

+ (NSValueTransformer *)dateJSONTransformer {

    return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

        NSNumber *dateNum = (NSNumber *)value;

        return [NSDatedateWithTimeIntervalSince1970:dateNum.floatValue];

    } reverseBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

        NSDate *numDate = (NSDate *)value;

        return [NSStringstringWithFormat:@"%f", [numDatetimeIntervalSince1970]];

    }];

}


5. 附一个model内嵌model的实现, 注意和上面最初的类型一样,是一个sysModel.class.

+ (NSValueTransformer *)sysJSONTransformer {

    return [MTLJSONAdapterdictionaryTransformerWithModelClass:sysModel.class];

    

    // 下面方法与上面这个效果一样。

    return [MTLValueTransformertransformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) {

        NSDictionary *dic = value;

        return [MTLJSONAdaptermodelOfClass:[sysModelclass] fromJSONDictionary:dicerror:nil];

    }];

}

然后就会得到一个内嵌的sysModel对象。


6. 再加上一个数组的对象。服务器返回的weather是一个数组, 然后数组中的对象是WeatherModel.

+ (NSValueTransformer *)arrWeathersJSONTransformer {

    return [MTLJSONAdapterarrayTransformerWithModelClass:WeatherModel.class];

}

 

7. 再来一个安全方法。如果我们要求其中的cod不能为空,我们就可以实现下面这个方法,来对当其中有数据为空时,进行一个容错处理。下面这个方法,当服务器有返回数据为null的键值时,而本地又对这个键做了属性匹配时,就会调用下面这个方法,一般情况下可能会崩溃, 所以建议如果有一些重要的不能为null的键,可以在这里进行处理。

- (void)setNilValueForKey:(NSString *)key {

    NSLog(@"nil value detect for key=%@", key);


    if ([keyisEqualToString:@"cod"]) {

        [selfsetValue:@"something"forKey:@"cod"];

    }else {

        [supersetNilValueForKey:key];

    }

}

注意这个方法仅对非指针类型有用,即int float, bool等, 其它类型要想容错[NSNull null], 需要在 MTLValueTransformer transformerUsingForwardBlock中进行识别处理。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值