前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不支持泛型OC在接口数据的返回处理(YYModel)

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

作者头像
大话swift
发布2019-11-21 11:58:54
1.4K0
发布2019-11-21 11:58:54
举报
文章被收录于专栏:大话swift

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

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

代码语言:javascript
复制
{
  "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的变化………

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档