美文网首页M_iOSiOS技能收藏UI笔记
iOS 网络下载类(数据模型)简单的封装---下拉刷新,上拉加载

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

作者: mark666 | 来源:发表于2015-12-22 11:16 被阅读1672次

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

    相关文章

      网友评论

      • Jabber_YQ:为什么在网络工具类里面对数据进行解析,在模型类里面解析后返回不是更好的选择吗:smirk:
      • csqingyang:1 虽然 网络请求数据,和对应的 数据解析操作同属于 数据层的操作,但是 两者之间的耦合应该尽量减少.试想 哪天 你换成了 YYModel 或者 ASI 等呢?
        2 数据层 应该做的操作:对万型数据进行操作,所以 尽量不要使用 Model 作为参数直接传递哦~ 只是踩过坑....
      • 弹钢琴的安徒生:谢谢分享。已收藏

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

      本文链接:https://www.haomeiwen.com/subject/heomhttx.html