您的位置:首页 > 移动开发 > IOS开发

ios Mantle使用小记

2015-08-20 11:28 567 查看
先从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], 需要在MTLValueTransformertransformerUsingForwardBlock中进行识别处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: