首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

iOS 网络下载类(数据模型)简单的封装---下拉刷新,上拉加载

2024-12-21 来源:花图问答

在请求网络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的正确。

显示全文