您的位置:首页 > 理论基础 > 计算机网络

iOS使用协议代理封装系统下载HttpRequest

2014-05-14 17:02 661 查看
//构思:
//1.首先需要一个外界传来的url
//2.使用代理把异步请求下来的数据回调
//  回调又有两种情况:(1).请求成功回调 (2).请求失败回调(网络请求失败),所以要设置两个代理方法
//3.还要考虑的是:如果有多个请求 那么用什么区分这些请求呢,所以要设置一个tag属性,来区分不同的请求
//4.调用这个请求 还需要一个开始指令


HttpRequest.h中
#import <Foundation/Foundation.h>

@class HttpRequest;
//设置协议 里面有两种方法(成功or失败)
@protocol HttpRequestDelegate <NSObject>
//成功
-(void)HttpRequestDidFinish:(HttpRequest *)request Data:(NSData *)data;
//失败
-(void)HttpRequestDidFail:(HttpRequest *)request;

@end

@interface HttpRequest : NSObject<NSURLConnectionDataDelegate>{
NSMutableData * _mData;//顶一个可变数据来接收下载的数据
}
@property (nonatomic,assign)int tag;
@property (nonatomic,copy)NSString * url;
//设置代理
@property (nonatomic,assign)id<HttpRequestDelegate>delegate;
//开始指令
-(void)startRequest;
@end


HttpRequest.m中

#import "HttpRequest.h"

@implementation HttpRequest
- (void)dealloc
{
[_mData release];
[super dealloc];
}
-(id)init{
if (self = [super init]) {
_mData = [[NSMutableData alloc]init];
}
return self;
}
-(void)startRequest{
//通过传过来的url创建链接
NSURL * url = [NSURL URLWithString:self.url];
//创建请求
NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:300];
//开始请求
[NSURLConnection connectionWithRequest:request delegate:self];
}
//接收响应头
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//在状态栏显示一个圈圈转动  代表正在请求
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
//接收响应体
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_mData appendData:data];//把接收的一片片的数据拼接
}
//接收完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//把状态栏的圈圈关闭
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//如果代理响应了协议中的方法
if ([self.delegate respondsToSelector:@selector(HttpRequestDidFinish:Data:)]) {
[self.delegate HttpRequestDidFinish:self Data:_mData];
}else{
NSLog(@"代理的完成方法未响应");
}
}
//接收失败
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if ([self.delegate respondsToSelector:@selector(HttpRequestDidFail:)]) {
[self.delegate HttpRequestDidFail:self];
}else{
NSLog(@"代理的失败方法未响应");
}
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: