在请求网络JSON数据的时候没有一套属于自己的封装下载类很是令我头疼,看过不少网络下载类,但是感觉满足不了自己的项目需求,于是通过参考一些别人的精华内容,终于完成了自己下载类的简单分装,现将代码主要内容贴出来,供大家参考。
//.h文件,主要实现了两个方法
@interface TXHttpTool : NSObject
//网络下载请求
+ (void)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;
//字典转模型
+ (id)modelTransformationWithResponseObj:(id)responseObj modelClass:(Class)modelClass;
@end
#import "TXHttpTool.h"
#import "AFNetworking.h"
#import "MJExtension.h"
@implementation TXHttpTool
+ (void)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure
{
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
[mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
// AFN请求成功时候调用block
// 先把请求成功要做的事情,保存到这个代码块
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
//这个方法主要是字典转模型,利用的是李明杰大神的字典转模型类,根据自己的模型来转,也可以将这个方法写在自己的网络请求的ViewController中
+ (NSMutableArray *)modelTransformationWithResponseObj:(id)responseObj modelClass:(Class)modelClass {
NSArray *lists = responseObj[@"data"];
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dict in lists) {
[modelClass mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{ @"Id" : @"id" };
}];
[array addObject:[modelClass mj_objectWithKeyValues:dict]];
}
return array;
}
@end
//外部的调用
#pragma mark ----- 下拉刷新
- (void)loadNewData
{
if (self.dataArray.count > 0)
{
[self.dataArray removeAllObjects];
if (_currentPage > 2)
{
_currentPage = 2;
}
}
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"page"] = @1;
[TXHttpTool GET:@"请求地址" parameters:param success:^(id responseObject) {
[self.mainTableView.mj_header endRefreshing];
//这里的datamodel 是自己的模型
NSArray *dictArray = [TXHttpTool modelTransformationWithResponseObj:responseObject modelClass:[dataModel class]];
[self.dataArray addObjectsFromArray:dictArray];
NSLog(@"模型中的个数:%lu",self.dataArray.count);
[self.mainTableView reloadData];
} failure:^(NSError *error) {
//这里是在网络错误的时候提醒,这个类就不贴出来了,可以自己封装,如果有需要的小伙伴可以留言
[TIXIANShow addTarget:self.view withTitStr:@"网络错误" addBool:NO];
}];
}
#pragma mark ------ 下拉加载更多
- (void)loadMoreData
{
NSLog(@"当前请求的第%ld页----------",_currentPage);
NSMutableDictionary *prama = [NSMutableDictionary dictionary];
//只要数据源里有数据才进行加载更多
if (self.dataArray.count>0)
{
prama[@"page"] = [NSString stringWithFormat:@"%ld",_currentPage];
}
[TXHttpTool GET:@"请求地址" parameters:prama success:^(id responseObject) {
//这里需要注意是再网络请求拿到数据以后,_currentPage才加一,否则数据源中的数据会乱的
if ([responseObject[@"msg"] isEqualToString:@""])
{
_currentPage++;
NSArray *dictArray = [TXHttpTool modelTransformationWithResponseObj:responseObject modelClass:[dataModel class]];
[self.dataArray addObjectsFromArray:dictArray];
[self.mainTableView reloadData];
}
[self.mainTableView.mj_footer endRefreshing];
} failure:^(NSError *error) {
[TIXIANShow addTarget:self.view withTitStr:@"网络错误" addBool:NO];
}];
}
以上就是所有的代码,特别对_currentPage的处理,不能盲目的++,下拉刷新每次取得是第一页的数据,而更多则是请求++以后的数据,当你离开界面的时候,你要保证更新后再加载更多时page的正确。
网友评论
2 数据层 应该做的操作:对万型数据进行操作,所以 尽量不要使用 Model 作为参数直接传递哦~ 只是踩过坑....