同步意爲着線程阻塞,在主線程中使用此方法會使應用Hang住而不響應任何用戶事件。因此,在應用程序設計時,大多被用在專門的子線程增長用戶體驗,或用異步請求代替(下面會講到)。 緩存
- (IBAction)grabURL:(id)sender { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; } }用 requestWithURL 快捷方法獲取 ASIHTTPRequest 的一個實例
- (IBAction)grabURLInBackground:(id)sender { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; [request startAsynchronous]; } - (void)requestFinished:(ASIHTTPRequest *)request { // Use when fetching text data NSString *responseString = [request responseString]; // Use when fetching binary data NSData *responseData = [request responseData]; } - (void)requestFailed:(ASIHTTPRequest *)request { NSError *error = [request error]; }與上面不一樣的地方是指定了一個 "delegate",並用 startAsynchronous 來啓動網絡請求
1. - (IBAction)grabURLInTheBackground:(id)sender 2. { 3. if (![self queue]) { 4. [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; 5. } 6. 7. NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 8. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 9. [request setDelegate:self]; 10. [request setDidFinishSelector:@selector(requestDone:)]; 11. [request setDidFailSelector:@selector(requestWentWrong:)]; 12. [[self queue] addOperation:request]; //queue is an NSOperationQueue 13. } 14. 15. - (void)requestDone:(ASIHTTPRequest *)request 16. { 17. NSString *response = [request responseString]; 18. } 19. 20. - (void)requestWentWrong:(ASIHTTPRequest *)request 21. { 22. NSError *error = [request error]; 23. }建立 NSOperationQueue,這個 Cocoa 架構的執行任務(NSOperation)的任務隊列。咱們經過 ASIHTTPRequest.h 的源碼能夠看到,此類自己就是一個 NSOperation 的子類。也就是說它能夠直接被放到"任務隊列"中並被執行。上面的代碼除了隊列的建立與添加操做外,其它代碼與上一例同樣。
1. - (void)dealloc 2. { 3. [request clearDelegatesAndCancel]; 4. [request release]; 5. ... 6. [super dealloc]; 7. }向服務器端上傳數據
1. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 2. [request setPostValue:@"Ben" forKey:@"first_name"]; 3. [request setPostValue:@"Copsey" forKey:@"last_name"]; 4. [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; 5. [request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];若是要發送自定義數據:
1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 2. [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]]; 3. // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody: 4. [request setRequestMethod:@"PUT"];下載文件
1. //Create a cookie 2. NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease]; 3. [properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue]; 4. [properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName]; 5. [properties setValue:@".allseeing-i.com" forKey:NSHTTPCookieDomain]; 6. [properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires]; 7. [properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath]; 8. NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease]; 9. 10. //This url will return the value of the 'ASIHTTPRequestTestCookie' cookie 11. url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"]; 12. request = [ASIHTTPRequest requestWithURL:url]; 13. [request setUseCookiePersistence:NO]; 14. [request setRequestCookies:[NSMutableArray arrayWithObject:cookie]]; 15. [request startSynchronous]; 16. 17. //Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie' 18. NSLog(@"%@",[request responseString]);大文件斷點續傳
[ request setAllowResumeForFileDownloads:YES ]; [ request setDownloadDestinationPath:downloadPath ];就行了。
ASIHTTPRequest會自動保存訪問過的URL信息,並備以後用。在如下幾個場景很是有用: 安全
1,當沒有網絡鏈接的時候。 服務器
2,已下載的數據再次請求時,僅當它與本地版本不樣時才進行下載。
ASIDownloadCache 設置下載緩存
它對Get請求的響應數據進行緩存(被緩存的數據必需是成功的200請求):
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
當設置緩存策略後,全部的請求都被自動的緩存起來。
另外,若是僅僅但願某次請求使用緩存操做,也能夠這樣使用:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
多種的緩存並存
僅僅須要建立不一樣的ASIDownloadCache,並設置緩存所使用的路徑,並設置到須要使用的request實例中:
ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];
[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];
[self setMyCache:cache];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[self myCache]];
緩存策略
緩存策略是咱們控制緩存行爲的主要方式,如:何時進行緩存,緩存數據的利用方式。
如下是策略可選列表(可組合使用):
ASIUseDefaultCachePolicy
這是一個默認的緩存策略「ASIAskServerIfModifiedWhenStaleCachePolicy」,這個很明白,見名知意(它不能與其它策略組合使用)
ASIDoNotReadFromCacheCachePolicy
所讀數據不使用緩存
ASIDoNotWriteToCacheCachePolicy
不對緩存數據進行寫操做
ASIAskServerIfModifiedWhenStaleCachePolicy
默認緩存行爲,request會先判斷是否存在緩存數據。a, 若是沒有再進行網絡請求。 b,若是存在緩存數據,而且數據沒有過時,則使用緩存。c,若是存在緩存數據,但已通過期,request會先進行網絡請求,判斷服務器版本與本地版本是否同樣,若是同樣,則使用緩存。若是服務器有新版本,會進行網絡請求,並更新本地緩存
ASIAskServerIfModifiedCachePolicy
與默認緩存大體同樣,區別僅是每次請求都會 去服務器判斷是否有更新
ASIOnlyLoadIfNotCachedCachePolicy
若是有緩存在本地,無論其過時與否,總會拿來使用
ASIDontLoadCachePolicy
僅當有緩存的時候纔會被正確執行,若是沒有緩存,request將被取消(沒有錯誤信息)
ASIFallbackToCacheIfLoadFailsCachePolicy
這個選項常常被用來與其它選項組合使用。請求失敗時,若是有緩存當網絡則返回本地緩存信息(這個在處理異常時很是有用)
若是設置了「defaultCachePolicy」則全部的請求都會使用此緩存。
緩存存儲方式
你能夠設置緩存的數據須要保存多長時間,ASIHTTPRequest提供了兩種策略:
a,ASICacheForSessionDurationCacheStoragePolicy,默認策略,基於session的緩存數據存儲。當下次運行或[ASIHTTPRequest clearSession]時,緩存將失效。
b,ASICachePermanentlyCacheStoragePolicy,把緩存數據永久保存在本地,
如:
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];
另外,也可使用clearCachedResponsesForStoragePolicy來清空指定策略下的緩存數據。
緩存其它特性
設置是否按服務器在Header裏指定的是否可被緩存或過時策略進行緩存:
[[ ASIDownloadCache sharedCache ] setShouldRespectCacheControlHeaders:NO ];
設置request緩存的有效時間:
[ request setSecondsToCache:60*60*24*30 ]; // 緩存30天
能夠判斷數據是否從緩存讀取:
[ request didUseCachedResponse ];
設置緩存所使用的路徑:
[ request setDownloadDestinationPath:[[ ASIDownloadCache sharedCache ] pathToStoreCachedResponseDataForRequest:request ]];
實現自定義的緩存
只要簡單的實現ASICacheDelegate接口就能夠被用來使用。
使用代理請求
默認的狀況下,ASIHTTPRequest會使用被設置的默認代理。但你也能夠手動修改http代理:
// Configure a proxy server manually
NSURL *url = [ NSURL URLWithString:@"http://allseeing-i.com/ignore" ];
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setProxyHost:@"192.168.0.1" ];
[ request setProxyPort:3128 ];
// Alternatively, you can use a manually-specified Proxy Auto Config file (PAC)
// (It's probably best if you use a local file)
[request setPACurl:[NSURL URLWithString:@"file:///Users/ben/Desktop/test.pac"]];
ASIHTTPRequest, 請求的其它特性
iOS4中,當應用後臺運行時仍然請求數據:
[ request setShouldContinueWhenAppEntersBackground:YES ];
是否有網絡請求:
[ ASIHTTPRequest isNetworkInUse ]
是否顯示網絡請求信息在status bar上:
[ ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO ];
設置請求超時時,設置重試的次數:
[ request setNumberOfTimesToRetryOnTimeout:2 ];
KeepAlive的支持:
// Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
[ request setPersistentConnectionTimeoutSeconds:120 ];
// Disable persistent connections entirely
[ request setShouldAttemptPersistentConnection:NO ];
版權歸旺財勇士全部~轉載需聲名~
cookie