iOS项目中的网络请求和上下拉刷新封装
一、运行效果图
现在的项目中不可避免的要使用到网络请求,而且几乎所有软件都有上下拉刷新功能,所以我在此对我的项目进行一个网络请求的封装和上下拉刷新的封装,如果有哪里不对,或更优的地方请在下面留言。
封装的好处:可以让我们的代码更佳精简,代码的耦合程度减少,便于代码的维护更新。
附上展示效果
二、程序实现
下面来介绍我封装代码的思路
使用了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项目中的网络请求和上下拉刷新封装的更多相关文章
- flutter中的网络请求和下拉刷新上拉加载,toast的案例
添加依赖 pull_to_refresh: ^1.5.6 dio: ^2.1.0 fluttertoast: ^3.0.1 DioUtil import 'package:dio/dio.dart'; ...
- swift中第三方网络请求库Alamofire的安装与使用
swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...
- React Native中的网络请求fetch和简单封装
React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...
- ios项目中引用其他项目复习
ios项目中引用其他开源项目,今天再次复习了,记个备注. 1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Li ...
- iOS-C文件添加到iOS项目中,运行报错
iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ...
- iOS项目中常见的文件
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...
- XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的“前往”|“前 ...
- 在Xamarin.iOS项目中使用预设数据库
在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...
随机推荐
- [BZOJ2648] SJY摆棋子 kd-tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 5421 Solved: 1910[Submit][Status][Disc ...
- 使用 gulp 编译 Sass
无论是 node-sass 还是 ruby-sass 使用 npm 安装都非常的慢,甚至会装不上.及其不利于团队协作.建议使用 less 作为 css 预处理器. 如果因为 less 不支持自定义函数 ...
- 【互动问答分享】第7期决胜云计算大数据时代Spark亚太研究院公益大讲堂
“决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第7期互动问答分享] Q1:Spark中的RDD到底是什么? RDD是Spark的核心抽象,可以把RDD看做“分布式函数编程语言”. ...
- [ubuntu] service apache2 restart [fail]
$ /etc/init.d/apache2 restart * Restarting web server apache2 [fail] 解决办法4步走: 1. sudo /etc/init.d/ap ...
- 51nod 1283 最小周长【注意开根号】
1283 最小周长 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 一个矩形的面积为S,已知该矩形的边长都是整数,求所有 ...
- 大数据技术之_16_Scala学习_07_数据结构(上)-集合
第十章 数据结构(上)-集合10.1 数据结构特点10.1.1 Scala 集合基本介绍10.1.2 可变集合和不可变集合举例10.2 Scala 不可变集合继承层次一览图10.2.1 图10.2.2 ...
- CentOS 7 下Ansiable搭建命令列表 及常用监控指令
根据文章 [ 自动化运维工具Ansible详细部署 ] 搭建 ============================================================== 1.Ans ...
- 微信小程序开发教程(三)项目目录及文件构成
第二章我们已经创建了一个Hello WXapplet示例小程序.我们从文件目录结构来了解Hello WXapplet项目的构成. 目录结构显示,在小程序项目的根目录下面包含3个app开头的文件(app ...
- OpenDigg - 挖掘优质开源项目库
OpenDigg - 挖掘优质开源项目库 OpenDigg专注于挖掘优质的开源项目库,通过技术和人工将软件项目分类整理,同时辅助简要的编译,方便广大程序员便捷地找到需要的开源项目. OpenDigg刚 ...
- 使用GIT时排除NuGet的packages文件夹
这段时间一直在用GIT做本地自己写的程序的源码管理工具,在使用的过程中发现了一个问题:Git往往会把NuGet的packages文件夹作为项目的一部分给添加进来了.网上搜了一下,原因是GIT只是和文件 ...