不支持泛型OC在接口数据的返回处理(YYModel)

  • 2019 年 11 月 21 日
  • 筆記

接着上篇文章中的API分module的处理,我们今天来说说返回数据参数的处理吧。

在说之前我们先看看数据返回的格式

{    "code": 200,    "message": "ok",    "data": "这个是泛型数据 map或者list"  }

怎么处理呢?下文我们结合YYModel进行转化使用

对于map的方式对应的是我们的Dictionary,YYModel给予我们友好的支持

+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary

而对于NSArray<NSDictionary>的数据格式给予我们了

+ (NSArray *)modelArrayWithClass:(Class)cls json:(id)json 这样的支持

哈哈,你会说既然有这个还有啥还说的呢?先等lz慢慢道来

前后端的数据返回对话

后:怎么给你们数据呢?

App: 给个json,我们根据code来做判断,code==OK 我们解析data,code!=OK 我们取出message提示

后:好的,那data就给你们默认list或者map吧

哈哈,有了上文我们来做吧

1 收到数据YYModel转换为Bean

2 判断OK,拿着data转换为Bean

@interfaceAppModel : NSObject

@property(nonatomic) int code;

@property(copy, nonatomic) NSString * message;

@property(nonatomic) iddata;

-(BOOL)isSuccess;

-(BOOL)isFailure;

-(void)showError:(void(^)(NSString * message)) show;

-(id)dataFor:(Class) modelClass;

+ (NSDictionary *)modelCustomPropertyMapper ;

@en

世界之大什么都会出现,我们来看一个例子:

哈哈,我们怎么解析啊,还有我们搞,重点来了

1 怎么让dataFor知道按照ArrayList中为map的处理

2 怎么处理ArrayList中全是String?

对于ArrayList中为map的我们做如下处理

@implementationInfoBanner

YYModelCommon

+(BOOL)asArray{

returnYES;

}

@end

对于全是String的我们做做如下处理

@implementationNSArray (YYModelStr)

+(NSArray *)modelArrayWithClass:(Class)cls onlyStrArray:(NSArray *)items{

if (items.count>0) {

if( [items.firstObjectisKindOfClass:NSString.class]){

return items;

}

}

return @[];

}

@end

然后是整体的逻辑啦

-(id)dataFor:(Class)modelClass{

id modelValue = nil;

if ([modelClass respondsToSelector:@selector(asArray)]) {

NSArray * items = self.data;

if([modelClass isKindOfClass:NSArray.class] || [items.firstObjectisKindOfClass:NSString.class]) {

modelValue = [NSArray modelArrayWithClass:modelClass onlyStrArray:self.data];

}else{

modelValue = [NSArray modelArrayWithClass:modelClass json:self.data];

}

}else{

modelValue = [modelClass modelWithDictionary:self.data];

}

return modelValue;

}

如何是不是感觉操作很另类啊,不过这个不要紧我们重点是看如何使用的

[selfuserGetFetch:url query:params

onSuccess:^(AppModel * _Nonnull modelValue, id _Nonnull responseObject) {

[weak_hoderVc hideHud];

NSObject * dataValue = [modelValue dataFor:dataModel];

#if Development

NSLog(@"%@",dataValue);

#endif

onSuccess(dataValue , responseObject);

NSLog(@"%@",responseObject);

NSLog(@"model = %@",dataValue.mj_keyValues);

} onFailure:^(NSString * _Nonnull message, NSString * _Nonnull shortLink) {

[weak_hoderVc hideHud];

// [weak_hoderVc.view makeToast:message];

}];

重点在于 NSObject * dataValue = [modelValue dataFor:dataModel];这个转化

最后是分模块的综合操作

[[ApiFetchshare] infoGetFetch:INFO_HOME_BANNER

query:@{} holder:self

dataModel:InfoBanner.class

onSuccess:^(NSObject * _Nonnull modelValue, id _Nonnull responseObject) {

NSArray * bannerList = (NSArray *)modelValue;

self->bannerListArr = [[NSMutableArray alloc]initWithArray:bannerList];

}];

[[ApiFetchshare] userGetFetch:USER_BROADCAST

query:@{@"userType":@(userType)} holder:self

dataModel:NSArray.class

onSuccess:^(NSObject * _Nonnull modelValue, id _Nonnull responseObject) {

}];

如何是不是完美的应对了data为List的变化………