標籤:
資料緩衝,就是把從網路上載入過來的資料,存到本地,目的是方便以後調用相同資料的時候,直接讀緩衝,不需要網路請求,既節省了client端的時間成本,有節省了serve端的負載成本。
ios當中,緩衝的對象NSUrlCache,iOS 5之前:只支援記憶體緩衝。從iOS 5開始:同時支援記憶體緩衝和硬碟緩衝。
3.NSURLCache的常見用法
(1)獲得全域緩衝對象(沒必要手動建立)NSURLCache *cache = [NSURLCache sharedURLCache];
(2)設定記憶體緩衝的最大容量(位元組為單位,預設為512KB)- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;
(3)設定硬碟緩衝的最大容量(位元組為單位,預設為10M)- (void)setDiskCapacity:(NSUInteger)diskCapacity;
(4)硬碟緩衝的位置:沙箱/Library/Caches
//在這裡不需要設定記憶體中緩衝的位置,因為這個位置是電腦自動分配的。只需設定硬碟緩衝的位置即可。
(5)取得某個請求的緩衝- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
(6)清除某個請求的緩衝- (void)removeCachedResponseForRequest:(NSURLRequest *)request;
(7)清除所有的緩衝- (void)removeAllCachedResponses;
4.緩衝GET請求
要想對某個GET請求進行資料緩衝,非常簡單
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 設定緩衝策略
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
只要設定了緩衝策略,系統會自動利用NSURLCache進行資料緩衝
5.iOS對NSURLRequest提供了7種緩衝策略:(實際上能用的只有4種)
NSURLRequestUseProtocolCachePolicy // 預設的緩衝策略(取決於協議)
NSURLRequestReloadIgnoringLocalCacheData // 忽略緩衝,重新請求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未實現
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略緩衝,重新請求
NSURLRequestReturnCacheDataElseLoad// 有緩衝就用緩衝,沒有緩衝就重新請求
NSURLRequestReturnCacheDataDontLoad// 有緩衝就用緩衝,沒有緩衝就不發請求,當做請求出錯處理(用於離線模式)
NSURLRequestReloadRevalidatingCacheData // 未實現
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 // 1.建立請求 4 NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8080/YYServer/video"]; 5 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 6 7 // 2.設定緩衝策略(有緩衝就用緩衝,沒有緩衝就重新請求) 8 request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; 9 10 // 3.發送請求11 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {12 if (data) {13 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];14 15 NSLog(@"%@", dict);16 }17 }];18 }19 20 /**21 // 定期處理緩衝22 // if (緩衝沒有達到7天) {23 // request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;24 // }25 // 獲得全域的緩衝對象26 NSURLCache *cache = [NSURLCache sharedURLCache];
定期清理緩衝的實現:
服務端返回時間(12312312312秒),用戶端轉化成天數判斷,如果大於七天(這裡比如說是七天緩衝時間),那麼先清理緩衝,再請求資料,如果小於七天,讀取緩衝。
27 // if (緩衝達到7天)
{
28 // [cache removeCachedResponseForRequest:request];
29 // }
30
31 // lastCacheDate = 2014-06-30 11:04:30
32
33 NSCachedURLResponse *response = [cache cachedResponseForRequest:request];
34 if (response)
{
35 NSLog(@"---這個請求已經存在緩衝");
36
}
else { 37 NSLog(@"---這個請求沒有緩衝"); 38 }
總結:
AFNetworking,應該內部實現了緩衝機制,有緩衝就先載入記憶體中得緩衝,沒緩衝再重新請求。(AFNetWorking,應該整合了NSUrlCache,網路類發送非同步請求)。
定期清理緩衝的實現:
服務端返回時間(12312312312秒),用戶端轉化成天數判斷,如果大於七天(這裡比如說是七天緩衝時間),那麼先清理緩衝,再請求資料,如果小於七天,讀取緩衝。
貌似也可以實現client端進行時間對比,定期清理緩衝,有想法的同學可以想一下。
ios-資料緩衝隨筆