在請求網絡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的正確。