不支持泛型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的变化………