IOS网络请求封装与下拉刷新上托加载更多
来源:互联网 发布:成都凶宅数据库查询 编辑:程序博客网 时间:2024/05/08 12:38
之前在网络上找到怎么去封装一个好用点的网络请求。花了不少时间,还是没找到。(原来的Reachability,感觉还是有点麻烦)后来没办法,只能自己试着写一个了。
当然,对于我这样的初学者来说,这是很困难,还好最后还是写出来,把自己遇到的一些问题与一些解决方法与大家分享下。
首先,我们先把网络请求做一个封装(为什么要这么做呢?以便我们以后多个界面用到时,代码不会这么多,当然,你也可以说我是偷懒。^_^ )在做封装网络的时候,我用的是本地的请求而不是用ASI,因为在后面我用到了MJ的第三方的库,这两个东西不能同时用。
#import <Foundation/Foundation.h>
//这是导入的一个网络请求的第三方库,相信大家都用过我就不说了
#import "Reachability.h"
//这是一个声名的代理协议
@protocol XZCNetWorkRequestDelegate;
@interface XZCNetWorkRequest :NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>
//设置的代理
@property (nonatomic,retain)id<XZCNetWorkRequestDelegate> delegate;
@property (nonatomic,retain)NSURL * url;
@property (nonatomic,retain)NSMutableData * requestData;
@property (nonatomic,retain)NSURLConnection * conn;
@property (nonatomic,retain)NSURLConnection * connStr;
@property (nonatomic,retain)NSString * string;
//用NSURL初始化的方法
-(XZCNetWorkRequest *)initWithUrl:(NSURL * )url;
//用String初始化的方法
-(XZCNetWorkRequest *)initWithString:(NSString *)string;
//开始发送网络请求
-(void)startRequest;
@end
@protocol XZCNetWorkRequestDelegate <NSObject>
//代理方法
-(void)requestFinsh:(XZCNetWorkRequest * )requst;
@end
#import "XZCNetWorkRequest.h"
@implementation XZCNetWorkRequest
-(XZCNetWorkRequest *)initWithUrl:(NSURL *)url
{
self = [superinit];
if(self){
_url = url;
}
return self;
}
-(XZCNetWorkRequest *)initWithString:(NSString *)string
{
self = [superinit];
if (self) {
_string = string;
}
return self;
}
-(void)startRequest
{
//用系统的NSURLRequest转换一个URL地址
NSURLRequest * request = [[NSURLRequestalloc] initWithURL:_url];
//用系统的NSURLRequest转换一个String地址
NSURLRequest * strRequest = [[NSURLRequestalloc] initWithURL:[NSURLURLWithString:_string]];
//String的请求
_connStr = [[NSURLConnectionalloc] initWithRequest:strRequestdelegate:selfstartImmediately:YES];
//URL的请求
_conn = [[NSURLConnectionalloc] initWithRequest:requestdelegate:selfstartImmediately:YES];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//初始化我们的数据
_requestData = [[NSMutableDataalloc] init];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//无论是哪个发过来的请求我们都增加到_requestData数据里
//当然,你也可以这么写[_requestData appendData:data]
if (connection == _conn) {
[_requestDataappendData:data];
}elseif(connection == _connStr){
[_requestDataappendData:data];
}
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//如果设置了代理,它就会进到IF里去,你也可以设置一个else,让它打印没设置代理的情况
if (_delegate) {
//这也设置了一个if语句,为了让程序和谐的运行,如果_delegate执行了这个方法
//我们都让代理去做一些事情
if ([_delegaterespondsToSelector:@selector(requestFinsh:)]) {
//让代理去实现代理方法,self就是把这个类给传回去
[_delegaterequestFinsh:self];
}
}
}
@end
#import <UIKit/UIKit.h>
#import "XZCNetWorkRequest.h"
//这个就是用一个创建的bookItem类做标签,把它保存到数据里,设置对应的属性,根据自己的需要
//方便我们取出
#import "bookItem.h"
//刷新的第三方库
#import "MJRefresh.h"
//MJRefreshBaseViewDelegate第三方库MJRefresh的代理方法
@interface ViewController :UIViewController<XZCNetWorkRequestDelegate,MJRefreshBaseViewDelegate>
@property (nonatomic,retain)NSMutableArray * dataArr;
@property (nonatomic)int page;
@property (nonatomic)int flag;
//MJ的尾刷新
@property (nonatomic,retain)MJRefreshFooterView * footerView;
//MJ的头刷新
@property (nonatomic,retain)MJRefreshHeaderView * headerView;
@property (nonatomic,retain)NSMutableData * dataCell;
@end
- (void)viewDidLoad
{
[super viewDidLoad];
_dataArr = [[NSMutableArrayalloc] init];
_page = 1;
_flag = 0;
//调用请求数据的方法
[selfrequestData];
//调用下拉刷新上托加载更多数据的方法
[selfrefreshTabel];
}
//发送请求数据,写成函数形式是为了方便多次调用,与我们封装是一个道理
-(void)requestData
{
//先在前面导入我们封装好的XZCNetWorkRequest类,用自己写的初始化方法创建
//之前我们写了两个初始方法一个是用NSString,一个是NSURL的,当然以后你可以写更多的的初始化方法
//到时候,别忘了分享给我哦!
XZCNetWorkRequest * nwr = [[XZCNetWorkRequestalloc] initWithString:[NSStringstringWithFormat:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=%d&category_id=6001×tamp=20140410085308&sign=XXXXXXXXXXXXXXXX",_page]];
//设置代理
nwr.delegate =self;
//开始发送网络请求
[nwr startRequest];
}
//实现代理方法
-(void)requestFinsh:(XZCNetWorkRequest *)requst
{
//这是在刷新时用到的,当_flag等于1就代表用户在下拉,我们让清空数组里旧的数据
//如果不写,每次下拉刷新,数组里都会有上次刷新的数据,这会让刷新出来多个重复的数据
if (_flag ==1) {
[_dataArrremoveAllObjects];
}
//我们的数据是JSON的类型,我们就用系统自带的NSJSONSerialization来接收。
NSMutableDictionary * dict = [NSJSONSerializationJSONObjectWithData:requst.requestDataoptions:NSJSONReadingMutableContainerserror:nil];
NSMutableArray * arr = [dict objectForKey:@"applications"];
//这两行代码是一个意思,选一个写就行了,就是得到封装界面的requestData的指针,为了下面清空做准备
//当然,你要是不写,还是会出现多个重复的数据
_dataCell = requst.requestData;
//[_dataCell appendData:requst.requestData];
//这个就是用一个创建的bookItem做标签,把它保存到_dataArr的数据里,设置对应的属性,根据自己的需要方便我们取出
for (int i =0; i < arr.count; i ++) {
NSDictionary * dict = [arr objectAtIndex:i];
bookItem * item = [[bookItemalloc] init];
item.iconUrl = dict[@"iconUrl"];
item.itunesUrl = dict[@"itunesUrl"];
[_dataArraddObject:item];
}
//得到数据时要记得刷新表_tabelView与关闭头尾动画
[_footerViewendRefreshing];
[_headerViewendRefreshing];
[_tabelView reloadData];
}
//下拉刷新上托加载更多数据的方法
-(void)refreshTabel
{
//设置头动画与代理
_footerView = [[MJRefreshFooterViewalloc] initWithScrollView:_tabelView];
_footerView.delegate =self;
//设置尾动画与代理
_headerView = [[MJRefreshHeaderViewalloc] initWithScrollView:_tabelView];
_headerView.delegate =self;
}
//下拉刷新上托加载更多数据的代理方法
-(void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView
{
//在上面我们通过_dataCell = requst.requestData;得到数据的指针
//现在我们把它的长度变为0,也就是requst.requestData为0,送到了我们清空数据的效果
_dataCell.length =0;
if (refreshView == _footerView) {
//如果是上托我们就让_page ++;这是让他加载下一个页面的数据
//不明白的同学,回到我们初始化XZCNetWorkRequest类时,看看
//把_flag设置为0,这只是标记的作用,你也可以设置成其他的,
_page ++;
_flag = 0;
//调用请求数据的方法
[selfrequestData];
}else{
//_page为1时,是最新的数据
//把_flag设置为1时,我们让它清空_dataArr里的数据
_page = 1;
_flag = 1;
//调用请求数据的方法
[selfrequestData];
}
}
网络请求封装与下拉刷新上托加载更多我们到现在是实现了,那个自定义TabelViewCell与TabelView我就不写了,下次有时间再补上。
- IOS网络请求封装与下拉刷新上托加载更多
- 下拉刷新与加载更多
- tableView下拉刷新与加载更多
- 微信小程序-下拉刷新与加载更多
- 下拉刷新--加载更多
- 封装RecyclerViewAdapter实现RecyclerView下拉刷新上拉加载更多
- RecyclerView封装--添加下拉刷新和上拉加载更多
- xamarin ios pullRefresh 下拉刷新,下拉加载更多
- IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五)
- SwipeRefreshLayout下拉刷新与上拉加载更多,分页加载
- RecycleView下拉刷新控件的封装(包括下拉刷新和加载更多 )
- Android 下拉刷新加载更多
- ListView 下拉刷新 加载更多
- RefreshRecyclerView下拉刷新,加载更多
- 下拉刷新和加载更多
- View下拉刷新加载更多
- iOS 下拉刷新和上拉加载更多
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS开发UI高级—15UITabBarController生命周期(使用storyoard搭建)
- 面试考题之9.2:链表(C/C++版)
- 循环单链表合并
- iOS开发UI高级—16APP主流UI框架结构
- U盘安装Centos7
- IOS网络请求封装与下拉刷新上托加载更多
- Network Namespace
- uml精粹——11.活动图(及整个读书笔记分享)
- 高斯消元
- 线性表接口
- iOS开发UI高级—17Modal模态视图简单介绍
- MIUI打开开发者usb调试方法
- 设计模式之 - 命令模式
- 用C++实现多线程Mutex锁(Win32)