封装一个简单的基类用来方便请求数据,以及把字典数组转换成模型数组,模型继承于该基类AFNetWorkAndBaseModel
先创建一个继承与AFNetWorkAndBaseModel的Test模型类,Test文件
#import "AFNetWorkAndBaseModel.h"
//因为此处model继承自AFNetWorkAndBaseModel,所以后面不用再引model父类的头文件
@interface Test : AFNetWorkAndBaseModel
@property(nonatomic,copy)NSString *title;
@end
#import "Test.h"
@implementation Test
- (void)dealloc{
[_title release];
[super dealloc];
}
@end
封装一个AFNetWorkAndBaseModel基类 , AFNetWorkAndBaseModel文件
#import <Foundation/Foundation.h>
//定义一个block类型
typedef void(^Block)(id result);
@interface AFNetWorkAndBaseModel : NSObject
//传进来一个url进行数据解析,然后通过block把结果传过去
+ (void)GetWithAFNByURL:(NSString *)urlStr completion:(Block)block;
//调用此方法,传进来一个数组(里面全是字典)模型化后返回模型数组
+ (NSMutableArray *)baseModelByArr:(NSMutableArray *)arr;
@end
#import "AFNetWorkAndBaseModel.h"
#import "AFNetworking.h"
@implementation AFNetWorkAndBaseModel
+ (void)GetWithAFNByURL:(NSString *)urlStr completion:(Block)block{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//设置响应解析对象
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//设置AFN对应支持的类型
[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/json",@"text/css",@"text/html",@"application/json",@"text/javascript",nil]];
[manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//如果返回回来的是字典,直接用block把请求下来的数据返回给调用的文件
//这里responseObject返回的是一个NSData,所以需要手动解析,为了保险也就用这种
id result = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
block(result);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"数据请求有误:%@",error);
}];
}
+ (NSMutableArray *)baseModelByArr:(NSMutableArray *)arr{
//创建一个数组,用来装model
NSMutableArray *modelArr = [NSMutableArray array];
//对数组进行遍历,里面的元素都是字典
for (NSDictionary *dic in arr) {
@autoreleasepool {//能确定某对象能释放了就尽快释放掉节约内存
//直接通过遍历构造器的方式创建对象
id model = [[self class] baseModelWithDic:dic];
//把对象添加到数组
[modelArr addObject:model];
}
}
return modelArr;
}
#pragma mark 遍历构造器方法用来创建对象
+ (instancetype)baseModelWithDic:(NSDictionary *)dic{
//采用多态的方式进行对象的创建
id model = [[[self class] alloc] initWithDic:dic];
return [model autorelease];
}
#pragma mark 自定义初始化方法用来实现对model用KVC进行赋值
- (instancetype)initWithDic:(NSDictionary *)dic{
self = [super init];
if (self) {
//用KVC的方式对成员变量进行赋值
[self setValuesForKeysWithDictionary:dic];
}
return self;
}
//此方法很重要
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
@end
使用这个AFNetWorkAndBaseModel基类 , ViewController.m文件
#import "ViewController.h"
#import "AFNetworking.h"
#import "Test.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createData];
}
- (void)createData{
//第一种方法解析数据和模型化
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://mrobot.pconline.com.cn/v2/cms/channels/1?pageSize=20&pageNo=1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dic = responseObject;
//调用方法
NSMutableArray *arr = [Test baseModelByArr:dic[@"articleList"]];
NSLog(@"%@",arr);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
//第二种方法解析数据和模型化
//1.先调用数据解析封装方法得到解析数据
[AFNetWorkAndBaseModel GetWithAFNByURL:@"http://mrobot.pconline.com.cn/v2/cms/channels/1?pageSize=20&pageNo=1" completion:^(id result) {
NSDictionary *dic = result;
//2.然后再调用字典模型化方法
NSMutableArray *arr = [Test baseModelByArr:dic[@"articleList"]];
NSLog(@"%@",arr);
}];
}
@end