iOS开发中对于NSURLRequest的封装
在ios开发中经常用到NSURLRequest类来进行url请求,通常有以下步骤
1.实例化NSURL;
2.实例化NSURLRequest;
3.连接[NSURLConnection connectionWithRequest:request delegate:self];
4.实现NSURLConnectionDataDelegate协议;
这样的话比较繁琐,可以对其进行封装
1.新建一个MyUrlRequest类
MyUrlRequest.h文件
@interface MyUrlRequest : NSObject <NSURLConnectionDataDelegate> { NSMutableData *_mData;//接收数据 } @property (nonatomic, copy) NSString *urlStr; @property (nonatomic, copy) void (^finishBlock)(NSData *data);//请求成功回调block @property (nonatomic, copy) void (^failedBlick)();//请求失败回调block @property (nonatomic, assign) BOOL isCache;//是否缓存 - (void)startRequest;//开始请求 @end
MyUrlRequest.m文件
#import "MyUrlRequest.h" #import "NSString+Hashing.h" @implementation QFURLRequest @synthesize urlStr; @synthesize finishBlock; @synthesize failedBlick; @synthesize isCache; - (id)init { if (self = [super init]) { _mData = [[NSMutableData alloc] init]; } return self; } - (void)startRequest { //MyRequestManager里边autorelease掉,在这里可能出错,所以需要retain [self retain]; if (self.isCache) { //如果有缓存,则使用缓存 NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/%@", [self.urlStr MD5Hash]]; NSFileManager *manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath:path]) { NSData *data = [NSData dataWithContentsOfFile:path]; self.finishBlock(data); return; } } NSURL *url = [NSURL URLWithString:self.urlStr]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection connectionWithRequest:request delegate:self]; } //实现NSURLConnectionDataDelegate协议 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_mData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [self release]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; //写缓存 if (self.isCache) { NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/%@", [self.urlStr MD5Hash]]; [_mData writeToFile:path atomically:YES]; } self.finishBlock(_mData); } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [self release]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; self.failedBlick(); } - (void)dealloc { [_mData release]; self.finishBlock = nil; self.failedBlick = nil; [super dealloc]; } @end
2.新建一个MyRequestManager类
.h文件
#import <Foundation/Foundation.h> #import "MyUrlRequest.h" @interface MyRequestManager : NSObject + (void)requestWithUrl:(NSString *)urlString andIsCache:(BOOL)isCache finish:(void(^)(NSData *data))finishBlock failed:(void(^)())failedBlock; @end
.m文件
#import "MyRequestManager.h" @implementation MyRequestManager + (void)requestWithUrl:(NSString *)urlString andIsCache:(BOOL)isCache finish:(void(^)(NSData *data))finishBlock failed:(void(^)())failedBlock { MyUrlRequest *request = [[[MyUrlRequest alloc] init] autorelease]; request.urlStr = urlString; request.isCache = isCache; request.finishBlock = finishBlock; request.failedBlick = failedBlock; //在发送startRequest消息之后,该类方法结束,可能会对request发送autorelease消息,这样的话在request的startRequest方法中就可能会产生错误,所以要在startRequest方法中retain一下 [request startRequest]; } @end
这样的话,以后再发送请求就可以直接调用
[MyRequestManager requestWithUrl:(NSString *)urlString andIsCache:(BOOL)isCache finish:(void(^)(NSData *data))finishBlock failed:(void(^)())failedBlock ];