• 第三方库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=%@ model:%@",dict, model);

                                       

                                       NSError *testError =nil;

                                       NSDictionary *dicFromModel = [MTLJSONAdapterJSONDictionaryFromModel:modelerror:&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,strongNSDate *date;

    @property (nonatomic,strongNSNumber *humidity;

    @property (nonatomic,strongNSNumber *temperature;

    @property (nonatomic,strongNSString *cod;

    @property (nonatomic,strongNSString *name;

    @property (nonatomic,strongNSString *xxxTestStr;

    @property (nonatomic,strongNSArray *arrWeathers;

    @property (nonatomic,strongsysModel *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:[sysModelclassfromJSONDictionary: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], 需要在MTLValueTransformertransformerUsingForwardBlock中进行识别处理。

  • 相关阅读:
    递归要记得返回
    git push的时候报Unable to find remote helper for 'https'的错误
    iphone手机上的click和touch事件
    对jquery的conflict方法的解读
    开发富文本编辑器的一些体会
    使用jquery制作动态加载型菜单
    解决jquery$命名符和其它框架的冲突问题
    基于geolocation来获取经纬度地址
    Python学习笔记2解析数据
    Python学习笔记1数据类型
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/7070357.html
Copyright © 2020-2023  润新知