代码地址如下:
http://www.demodashi.com/demo/11621.html

一、运行效果图

现在的项目中不可避免的要使用到网络请求,而且几乎所有软件都有上下拉刷新功能,所以我在此对我的项目进行一个网络请求的封装和上下拉刷新的封装,如果有哪里不对,或更优的地方请在下面留言。

封装的好处:可以让我们的代码更佳精简,代码的耦合程度减少,便于代码的维护更新。

附上展示效果

二、程序实现

下面来介绍我封装代码的思路

使用了AFNetworking和MJRefresh三方工程

Model文件为请求回来后解析的类提供了三个方法(PS:这里我没有使用第三方解析数据,是觉得第三方有局限性,例如:我的字符串与服务器返回的字符串不一致,需要拼接,用三方的话就要在外面拼接,而自己写的话可以直接在解析时拼接,更符合MVC设计模式)

  • //返回模型 属性方法,不常使用
    -(instancetype)initWithDict:(NSDictionary *)dict;

  • //返回模型 类方法,经常使用
    +(instancetype)dataModelWithDict:(NSDictionary *)dict;

  • //返回数组 类方法,如果数据为数组,那么就可以使用
    +(NSMutableArray *)dataModelWithArray:(NSArray *)dataArr;

```
-(instancetype)initWithDict:(NSDictionary *)dict
{
self = [super init];
if (self) {
//解析数据
self.ID = dict[@"id"];
self.titleStr = dict[@"title"];
self.thumbStr = dict[@"thumb"];
self.introStr = dict[@"introduction"];
self.timeStr = dict[@"createAt"];
}
return self;
}

+(instancetype)dataModelWithDict:(NSDictionary *)dict

{

return [[self alloc]initWithDict:dict];

}

+(NSMutableArray *)dataModelWithArray:(NSArray *)dataArr

{

NSMutableArray *dataMutArr = [NSMutableArray array];

for (int i = 0; i < dataArr.count; i++) {

CFDataModel *dataModel = [self dataModelWithDict:dataArr[i]];

[dataMutArr addObject:dataModel];

}

return dataMutArr;

}

***Tool文件***为主要自定义封装文件
>CFSendNet是对网路进行的封装
CFCustomHeader和CFCustomFooter是对上下拉进行的封装 在对网络进行封装的时候,考虑到页面消失时,要把页面的请求给关闭掉这种情况,所以封装起来代码相对少一点,因为请求管理者要是视图控制器的属性。(PS:这种需要在视图管理者中需懒加载网络管理者)
代码如下:

/**

发送网络请求

@param manager 请求管理者

@param urlStr 请求网址

@param parameter 请求参数

@param completion 请求成功返回

@param faild 请求失败返回

*/

+(void)sendNetAFNManger:(AFHTTPSessionManager *)manager urlStr:(NSString *)urlStr parameter:(NSDictionary *)parameter completion:(void(^)(NSDictionary *dict))completion faild:(void(^)(NSError *error))faild

{

[manager GET:urlStr parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功

completion(responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//请求失败

faild(error);

}];

}

/**

结束任务

*

+(void)cancelAFNManger:(AFHTTPSessionManager *)manager

{

[manager.tasks makeObjectsPerformSelector:@selector(cancel)];

}

如果不考虑页面消失时的网络处理,相对而言封装更多一点
代码如下:

/**

发送网络请求

@param urlStr 请求网址

@param parameter 请求参数

@param completion 请求成功返回

@param faild 请求失败返回

*/

+(void)sendNetUrlStr:(NSString *)urlStr parameter:(NSDictionary *)parameter completion:(void(^)(NSDictionary *dict))completion faild:(void(^)(NSError *error))faild

{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:urlStr parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功

completion(responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//请求失败

faild(error);

}];

}

***ViewCntroller文件***就是主要的视图了

pragma mark - 懒加载UITableView和AFHTTPSessionManager

-(UITableView *)tableview

{

if (!_tableview) {

_tableview = [[UITableView alloc]init];

}

return _tableview;

}

-(AFHTTPSessionManager *)manger

{

if (!_manger) {

_manger = [AFHTTPSessionManager manager];

}

return _manger;

}

  • (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor brownColor];

    self.tableview.frame = self.view.bounds;

    self.tableview.dataSource = self;

    self.tableview.rowHeight = 60;

    [self.view addSubview:self.tableview];

//TODO:增加上下拉刷新功能

CFCustomHeader *customHeader = [CFCustomHeader customHeaderTarget:self selector:@selector(loadNewData)];

self.tableview.mj_header = customHeader;

CFCustomFooter *customFooter = [CFCustomFooter customFooterTarget:self selector:@selector(loadMoreData)];
self.tableview.mj_footer = customFooter; [self.tableview.mj_header beginRefreshing];//MJRefresh开始刷新

}

//视图消失就取消请求任务

-(void)viewWillDisappear:(BOOL)animated

{

[CFSendNet cancelAFNManger:self.manger];

}


发送请求时要注意,上拉加载更多失败时页数要减一,否则会遗漏数据。下拉刷新时,数据要清空,不然会有重复数据。请求失败大多为网络不可用,有些时候需要展示一个网络不可用的界面,就是更换界面了。

pragma mark - 发送请求

-(void)loadNewData

{

[CFSendNet cancelAFNManger:self.manger];

_pageNo = 1;

//1.视图懒加载请求管理者

//2.拼接参数
NSString *kindStr = @"/news";
NSString *urlStr = [NSString stringWithFormat:@"%@%@",httpHead,kindStr];//宏定义头部,拼接字符串
NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
parameter[@"address"] = @"";
parameter[@"rows"] = @"5";
parameter[@"page"] = [NSString stringWithFormat:@"%zd",_pageNo]; //3.发送网路请求
[self.manger GET:urlStr parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//TODO:请求成功
if ([responseObject[@"status"] intValue] == 200) { //数据转模型
_dataArr = [NSMutableArray array];
_dataArr = [CFDataModel dataModelWithArray:responseObject[@"data"]]; [self.tableview reloadData]; }else{
NSLog(@"失败了,错误了");
}
//结束刷新
[self.tableview.mj_header endRefreshing];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//结束刷新
[self.tableview.mj_header endRefreshing];
//更换界面
NSLog(@"%@",error);
}];

}

//请求更多数据

-(void)loadMoreData

{

[CFSendNet cancelAFNManger:self.manger];

++_pageNo;

//1.视图懒加载请求管理者

//2.拼接参数
NSString *kindStr = @"/news";
NSString *urlStr = [NSString stringWithFormat:@"%@%@",httpHead,kindStr];//宏定义头部,拼接字符串
NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
parameter[@"address"] = @"";
parameter[@"rows"] = @"5";
parameter[@"page"] = [NSString stringWithFormat:@"%zd",_pageNo]; //3.发送网路请求
[self.manger GET:urlStr parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//TODO:请求成功
if ([responseObject[@"status"] intValue] == 200) { //数据转模型
[_dataArr addObjectsFromArray:[CFDataModel dataModelWithArray:responseObject[@"data"]]]; [self.tableview reloadData]; }else{
--_pageNo;
NSLog(@"失败了,错误了");
}
//结束刷新
[self.tableview.mj_footer endRefreshing];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//结束刷新
[self.tableview.mj_footer endRefreshing];
--_pageNo;
//更换界面
NSLog(@"%@",error);
}];

}

pragma mark - UITableViewDataSource

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

    //这里最好也设置一下

    self.tableview.mj_footer.hidden = (_dataArr.count == 0);

    return _dataArr.count;

    }

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

    static NSString *cellID = @"cellID";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (!cell) {

    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];

    }

    //设置数据

    CFDataModel *dataModel = _dataArr[indexPath.row];

    cell.textLabel.text = dataModel.titleStr;

    cell.detailTextLabel.text = dataModel.introStr;

    return cell;

    }


> 代码地址如下:<br>http://www.demodashi.com/demo/11621.html > 注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

iOS项目中的网络请求和上下拉刷新封装的更多相关文章

  1. flutter中的网络请求和下拉刷新上拉加载,toast的案例

    添加依赖 pull_to_refresh: ^1.5.6 dio: ^2.1.0 fluttertoast: ^3.0.1 DioUtil import 'package:dio/dio.dart'; ...

  2. swift中第三方网络请求库Alamofire的安装与使用

    swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...

  3. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  4. ios项目中引用其他项目复习

    ios项目中引用其他开源项目,今天再次复习了,记个备注. 1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Li ...

  5. iOS-C文件添加到iOS项目中,运行报错

    iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ...

  6. iOS项目中常见的文件

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  7. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  8. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的“前往”|“前 ...

  9. 在Xamarin.iOS项目中使用预设数据库

    在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...

随机推荐

  1. python os用法精简版

    import os print(os.getcwd()) #返回当前路径,无参数 print(os.listdir('E:\zsfile')) #该路径下所有文件名 os.remove('E:\zsf ...

  2. 来,让我们谈一谈 Normalize.css

    Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML5准备 ...

  3. api接口思路介绍

    现在很流行api了,但各种api做法不一样,下面我整理了一些自己的想法,也是看了各大门户网站开放的api应用想到的,与大家分享分享,高手跳过.   API(Application Programmin ...

  4. CF982 C Cut 'em all!【树/DFS/思维】

    [链接]:CF982C [题意]:有一颗树,你需要切掉一些边,使这颗树分拆成若干个节点为偶数的联通分量,最多能切掉几条边.若不能切,输出-1. [分析]: 1.若点数n为奇数,因为奇数不可能分为偶数, ...

  5. B - ACM小组的古怪象棋 【地图型BFS+特殊方向】

    ACM小组的Samsara和Staginner对中国象棋特别感兴趣,尤其对马(可能是因为这个棋子的走法比较多吧)的使用进行深入研究.今天他们又在 构思一个古怪的棋局:假如Samsara只有一个马了,而 ...

  6. swagger (九)

    创建创建microservicecloud-swagger pom文件 eureka: client: #客户端注册进eureka服务列表内 service-url: defaultZone: htt ...

  7. 36、Django实战第36天:首页功能开发

    1.编辑users.views.py ... class IndexView(View): """ 首页 """ def get(self, ...

  8. RabbitMQ生产部署指南

    像RabbitMQ这样的数据服务通常有许多可调参数.一些配置对开发有很大的意义,但并不适合生产,本指南旨在为此提供帮助 虚拟主机 例如,在单租户环境中,当您的RabbitMQ集群专门为生产中的单个系统 ...

  9. sed replace HEX sequence in your binary file:

    Here is how to replace a HEX sequence in your binary file: $ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x5 ...

  10. 10.1(java学习笔记)JDBC基本操作(连接,执行SQL语句,获取结果集)

    一.JDBC JDBC的全称是java database connection java数据库连接. 在java中需要对数据库进行一系列的操作,这时就需要使用JDBC. sun公司制定了关于数据库操作 ...