IOS网络请求封装与下拉刷新上托加载更多

        之前在网络上找到怎么去封装一个好用点的网络请求。花了不少时间,还是没找到。(原来的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 = [super init];

    if(self){

        _url = url;

    }


    return self;

}

-(XZCNetWorkRequest *)initWithString:(NSString *)string

{

    self = [super init];

    if (self) {

        _string = string;

    }


    return self;

}


-(void)startRequest

{

    //用系统的NSURLRequest转换一个URL地址

    NSURLRequest * request = [[NSURLRequest alloc] initWithURL:_url];

    //用系统的NSURLRequest转换一个String地址

    NSURLRequest * strRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:_string]];

    //String的请求

    _connStr = [[NSURLConnection alloc] initWithRequest:strRequest delegate:self startImmediately:YES];

    //URL的请求

    _conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

    

}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    //初始化我们的数据

    _requestData = [[NSMutableData alloc] init];

    

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    //无论是哪个发过来的请求我们都增加到_requestData数据里

    //当然,你也可以这么写[_requestData appendData:data]

    if (connection == _conn) {

        [_requestData appendData:data];

    }else if(connection  == _connStr){

        [_requestData appendData:data];

    }


}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    //如果设置了代理,它就会进到IF里去,你也可以设置一个else,让它打印没设置代理的情况

    if (_delegate) {

        //这也设置了一个if语句,为了让程序和谐的运行,如果_delegate执行了这个方法

        //我们都让代理去做一些事情

        if ([_delegate respondsToSelector:@selector(requestFinsh:)]) {

            //让代理去实现代理方法,self就是把这个类给传回去

            [_delegate requestFinsh: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 = [[NSMutableArray alloc] init];

   

    _page = 1;

    _flag = 0;

//调用请求数据的方法

        [self requestData];

//调用下拉刷新上托加载更多数据的方法

[self refreshTabel];

}


//发送请求数据,写成函数形式是为了方便多次调用,与我们封装是一个道理

-(void)requestData

{

 //先在前面导入我们封装好的XZCNetWorkRequest类,用自己写的初始化方法创建

    //之前我们写了两个初始方法一个是用NSString,一个是NSURL的,当然以后你可以写更多的的初始化方法

    //到时候,别忘了分享给我哦!

    XZCNetWorkRequest * nwr = [[XZCNetWorkRequest alloc] initWithString:[NSString stringWithFormat:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=%d&category_id=6001&timestamp=20140410085308&sign=XXXXXXXXXXXXXXXX",_page]];

    //设置代理

    nwr.delegate = self;

    //开始发送网络请求

    [nwr startRequest];


}

//实现代理方法

-(void)requestFinsh:(XZCNetWorkRequest *)requst

{

    //这是在刷新时用到的,当_flag等于1就代表用户在下拉,我们让清空数组里旧的数据

    //如果不写,每次下拉刷新,数组里都会有上次刷新的数据,这会让刷新出来多个重复的数据

    if (_flag == 1) {

        [_dataArr removeAllObjects];

        

    }

    //我们的数据是JSON的类型,我们就用系统自带的NSJSONSerialization来接收。

    NSMutableDictionary * dict = [NSJSONSerialization JSONObjectWithData:requst.requestData options:NSJSONReadingMutableContainers error: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 = [[bookItem alloc] init];

        item.iconUrl = dict[@"iconUrl"];

        item.itunesUrl = dict[@"itunesUrl"];

        

        [_dataArr addObject:item];

        

    }

    //得到数据时要记得刷新表_tabelView与关闭头尾动画

    [_footerView endRefreshing];

    [_headerView endRefreshing];

    [_tabelView reloadData];

    

}

//下拉刷新上托加载更多数据的方法

-(void)refreshTabel

{

    //设置头动画与代理

    _footerView = [[MJRefreshFooterView alloc] initWithScrollView:_tabelView];

    _footerView.delegate = self;

    //设置尾动画与代理

    _headerView = [[MJRefreshHeaderView alloc] initWithScrollView:_tabelView];

    _headerView.delegate = self;

}

//下拉刷新上托加载更多数据的代理方法

-(void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView

{

    //在上面我们通过_dataCell = requst.requestData;得到数据的指针

    //现在我们把它的长度变为0,也就是requst.requestData0,送到了我们清空数据的效果

    _dataCell.length = 0;

    if (refreshView == _footerView) {

        //如果是上托我们就让_page ++;这是让他加载下一个页面的数据

        //不明白的同学,回到我们初始化XZCNetWorkRequest类时,看看

        //_flag设置为0,这只是标记的作用,你也可以设置成其他的,

        _page ++;

        _flag = 0;

        //调用请求数据的方法

        [self requestData];

        

    }else{

        //_page1时,是最新的数据

         //_flag设置为1时,我们让它清空_dataArr里的数据

        _page = 1;

        _flag = 1;

        //调用请求数据的方法

        [self requestData];

    }


}


网络请求封装与下拉刷新上托加载更多我们到现在是实现了,那个自定义TabelViewCell与TabelView我就不写了,下次有时间再补上。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值