Three20 NetWork 是一个针对NSUrlConnection进行封装的一个强大的网络处理模块,并且实现了强大的缓存机制。
本文原创,转载请写:http://blog.csdn.net/xbiii3s/article/details/6683899 QQ群: 48958661
1. 首先我们先看看 TTURLRequest 这个类, 允许你自定义http method, body and parameters, as well as natural response. processing using TTURLResponse objects.
#import <Foundation/Foundation.h>
// Network
#import "Three20Network/TTURLRequestCachePolicy.h"
// Core
#import "Three20Core/TTCorePreprocessorMacros.h"// For __TTDEPRECATED_METHOD
@protocol TTURLRequestDelegate;
@protocol TTURLResponse;
@interface TTURLRequest : NSObject {
NSString* _urlPath; //url路径
NSString* _httpMethod; //http方法
NSData* _httpBody; //http体
NSMutableDictionary* _parameters; //参数
NSMutableDictionary* _headers; //http头
NSString* _contentType; //内容类型
NSStringEncoding _charsetForMultipart; //字符集编码
NSMutableArray* _files; //上传多个文件
id<TTURLResponse> _response;
TTURLRequestCachePolicy _cachePolicy; //缓存代理
NSTimeInterval _cacheExpirationAge; //缓存实效时间,默认是1天
NSString* _cacheKey; //缓存key
NSDate* _timestamp;
NSInteger _totalBytesLoaded; //已经加载的字节数
NSInteger _totalBytesExpected; //预计下载的字节数
NSInteger _totalBytesDownloaded; //下载的总字节数
NSInteger _totalContentLength; //总的内容长度
id _userInfo; //用户信息
BOOL _isLoading; //是否正在加载
BOOL _shouldHandleCookies; //是否处理cooke
BOOL _respondedFromCache; //是否从缓存里面取
BOOL _filterPasswordLogging; //记录密码日志
NSMutableArray* _delegates;
}
/**
* 请求加载的url路径
*/
@property (nonatomic, copy) NSString* urlPath;
/**
同上,已经不再使用了,用urlPath代替
*/
@property (nonatomic, copy) NSString* URL__TTDEPRECATED_METHOD;
/**
* 请求的http 方法名字
* @example @"POST"
* @example @"GET"
* @example @"PUT"
* @默认 (t @"GET")
*/
@property (nonatomic, copy) NSString* httpMethod;
/* * 一个处理response data 并且可以解析和验证的对象, 下面几个是处理的类型, 其中TTURLXMLResponse需要添加一个扩展框架 extThree20XML
* @see TTURLDataResponse
* @see TTURLImageResponse
* @see TTURLXMLResponse
*/
@property (nonatomic, retain) id<TTURLResponse> response;
/**
* 请求发送的Http body
* 如果提供了,就会一直使用. 当你使用POST或put方法的时候 ,先确定下。
* 如果httpBody提供了,那么post或put data 会从parameters属性 里面生成,不会被使用
*/
@property (nonatomic, retain) NSData* httpBody;
/**
* 请求数据的内容类型 The content type of the data in the request.
* 如果没有提供,并且httpMethod是post或 put ,那么contentType 是@"multipart/form-data".
*/
@property (nonatomic, copy) NSString* contentType;
/**
* HTTP POST/PUT方法的参数
*/
@property (nonatomic, readonly) NSMutableDictionary* parameters;
/**
* 自定义HTTP headers.
*/
@property (nonatomic, readonly) NSMutableDictionary* headers;
/**
* @默认缓存: TTURLRequestCachePolicyDefault
*/
@property (nonatomic)TTURLRequestCachePolicy cachePolicy;
/**
* 设置response缓存数据的最长时间
*默认是TT_DEFAULT_CACHE_EXPIRATION_AGE (1 week)
*/
@property (nonatomic)NSTimeInterval cacheExpirationAge;
/**
* 如果没有cache key, 那么唯一的key是从request data生成的。
*如果请求是post或put,那么post或put参数也会使用cache key生成的。
*如果设置了cache key ,你可以覆盖默认的cache key,使用你自己的。
*/
@property (nonatomic, copy) NSString* cacheKey;
/**
* 一个虚拟的对象,用来标识请求的唯一对象标识
*生成TTUserInfo对象会在这里使用
* @see TTUserInfo
*/
@property (nonatomic, retain) id userInfo;
@property (nonatomic, retain) NSDate* timestamp;
/**
* 当前请求是否激活了
*/
@property (nonatomic) BOOL isLoading;
/**
* 请求是否使用默认的cookie处理
* @param YES if cookies should be sent with and set for this request;
* otherwise NO.
* @discussion The default is YES - 相反cookies are sent from and
* stored to the cookie manager by default.
* @default YES
*/
@property (nonatomic)BOOL shouldHandleCookies;
/**
* 请求已经加载的字节数
*/
@property (nonatomic)NSInteger totalBytesLoaded;
/**
* 请求预计要加载的字节数
*/
@property (nonatomic)NSInteger totalBytesExpected;
/**
*已经从服务器上下载的总字节数
*/
@property (nonatomic)NSInteger totalBytesDownloaded;
/**
* 请求的总内容长度
*/
@property (nonatomic)NSInteger totalContentLength;
/**
* 是否从缓存加载
* 前提是请求已经加载完成
*/
@property (nonatomic)BOOL respondedFromCache;
/**
名字为密码的参数是否要记录日志.
*/
@property (nonatomic,assign) BOOL filterPasswordLogging;
/**
* 当创建multipart/form-data 数据使用的字符集 *
* @默认是 NSUTF8StringEncoding
*/
@property (nonatomic)NSStringEncoding charsetForMultipart;
/**
* An array of non-retained objects that receive messages about the progress of the request.
*/
@property (nonatomic, readonly) NSMutableArray* delegates;
+ (TTURLRequest*)request;
+ (TTURLRequest*)requestWithURL:(NSString*)URL delegate:(id/*<TTURLRequestDelegate>*/)delegate;
- (id)initWithURL:(NSString*)URL delegate:(id/*<TTURLRequestDelegate>*/)delegate;
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**
*添加一个文件,整个文件数据发送出去
*/
- (void)addFile:(NSData*)data mimeType:(NSString*)mimeType fileName:(NSString*)fileName;
/**
* 尝试发送一个请求
*如果请求可以通过缓存来处理,就是同步请求
* 否则这个就是异步请求。
* @return YES 如果请求从缓存加载的话,就是同步请求
*/
- (BOOL)send;
/**
* 尝试发送一个同步请求
*不管数据是从网络取还是从缓存取,都会使用同步请求
*/
- (BOOL)sendSynchronously;
/**
* 取消请求
*如果是多个相同的url请求,其他的不会取消
*/
- (void)cancel;
- (NSURLRequest*)createNSURLRequest;
@end
DEMO:
先创建一个TTURLRequest 对象 TTURLRequest *request = [TTURLRequestrequestWithURL: kRequestURLPath delegate:self];
并实现TTURLRequestDelegate协议,
处理图片请求使用: TTURLImageResponse,TTURLImageResponse仅仅是response types里面的一个, 你也可以使用 TTURLDataResponse 和 TTURLXMLResponse(这个xmlResponse需要添加一个扩展框架extThree20XML )
request.response = [[[TTURLImageResponsealloc] init]autorelease];
[request send]; //异步方式去请求
#pragma mark -
#pragma mark TTURLRequestDelegate
//开始请求
- (void)requestDidStartLoad:(TTURLRequest*)request {
[_requestButtonsetTitle:@"Loading..."forState:UIControlStateNormal];
}
//请求完成
- (void)requestDidFinishLoad:(TTURLRequest*)request {
TTURLImageResponse* imageResponse = (TTURLImageResponse*)request.response;
if (nil == _imageView) {
_imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
[_scrollView addSubview:_imageView];
}
_imageView.image = imageResponse.image;
[_imageView sizeToFit];
_imageView.alpha = 0;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
_requestButton.alpha = 0;
_clearCacheButton.alpha = 0;
[_scrollView setContentSize:_imageView.frame.size];
_imageView.alpha = 1;
[UIView commitAnimations];
}
//请求错误处理
- (void)request:(TTURLRequest*)request didFailLoadWithError:(NSError*)error {
[_requestButtonsetTitle:@"Failed to load, try again."forState:UIControlStateNormal];
}