1、關於統一個URL的屢次要求
有時刻,對統一個URL要求屢次,前往的數據能夠都是一樣的,好比辦事器上的某張圖片,不管下載若干次,前往的數據都是一樣的。
下面的情形會形成以下成績
(1)用戶流量的糟蹋
(2)法式呼應速度不敷快
處理下面的成績,普通斟酌對數據停止緩存。
2、緩存
為了進步法式的呼應速度,可以斟酌應用緩存(內存緩存\硬盤緩存)
第一次要求數據時,內存緩存中沒稀有據,硬盤緩存中沒稀有據。
緩存數據的進程
當辦事器前往數據時,須要做以下步調
(1)應用辦事器的數據(好比解析、顯示)
(2)將辦事器的數據緩存到硬盤(沙盒)
此時緩存的情形是:內存緩存中稀有據,硬盤緩存中稀有據。
再次要求數據分為兩種情形:
(1)假如法式並沒有被封閉,一向在運轉
那末此時內存緩存中稀有據,硬盤緩存中稀有據。假如此時再次要求數據,直接應用內存緩存中的數據便可
(2)假如法式從新啟動
那末此時內存緩存曾經消逝,沒稀有據,硬盤緩存照舊存在,還稀有據。假如此時再次要求數據,須要讀取內存中緩存的數據。
提醒:從硬盤緩存中讀取數據後,內存緩存中又稀有據了
3、緩存的完成
1.解釋:
因為GET要求普通用來查詢數據,POST要求普通是發年夜量數據給辦事器處置(更改性比擬年夜)
是以普通只對GET要求停止緩存,而纰謬POST要求停止緩存
在IOS中,可使用NSURLCache類緩存數據
IOS 5之前:只支撐內存緩存。從IOS 5開端:同時支撐內存緩存和硬盤緩存
2.NSURLCache
iOS中得緩存技巧用到了NSURLCache類。
緩存道理:一個NSURLRequest對應一個NSCachedURLResponse
緩存技巧:把緩存的數據都保留到數據庫中。
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 // 未完成
6.緩存的留意事項
緩存的設置須要依據詳細的情形斟酌,假如要求某個URL的前往數據:
(1)常常更新:不克不及用緩存!好比股票、彩票數據
(2)原封不動:武斷用緩存
(3)偶然更新:可以按期更改緩存戰略 或許 消除緩存
提醒:假如年夜量應用緩存,會越積越年夜,建議按期消除緩存
4、當地緩存開辟相干
為了勤儉流量,同時也是為了更好的用戶體驗,今朝許多運用都應用當地緩存機制,個中以網易消息的緩存功效最為精彩。我本身的運用也想參加當地緩存的功效,因而我從網上查閱了相干的材料,發明整體上說有兩種辦法。一種是本身寫緩存的處置,一種是采取ASIHTTPRequest中的ASIDownloadCache。
辦法一:普通將辦事器第一次前往的數據保留在沙盒外面。如許在手機斷網的情形下可以從當地讀取數據了。
1.保留到沙盒的代碼:
+ (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;
{
NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
[setting setObject:str forKey:key];
[setting synchronize];
}
2.讀取當地沙盒的代碼
讀取之前起首依據type和Id斷定當地能否有
+ (NSString *)getCache:(int)type andID:(int)_id
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
NSString *value = [settings objectForKey:key];
return value;
}
假如沙盒外面稀有據
NSString *value = [Tool getCache:5 andID:self.QiuTime];
if (value) {
NSDictionary *backdict = [value JSONValue];
if ([backdict objectForKey:@"items"]) {
NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];
for (NSDictionary *qiushi in array) {
QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];
[self.list addObject:qs];
}
}
[self.tableView reloadData];
}
[self.tableView tableViewDidFinishedLoadingWithMessage:@"數據全體加載完了.."];
self.tableView.reachedTheEnd = YES;
辦法二:應用ASIHTTPRequest和ASIDownloadCache完成當地緩存
1、設置全局的Cache
在AppDelegate.h中添加一個全局變量
@interface AppDelegate : UIResponder
{
ASIDownloadCache *myCache;
}
@property (strong, nonatomic) UIWindow *Window;
@property (nonatomic,retain) ASIDownloadCache *myCache;
在AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions辦法中添加以下代碼
//自界說緩存
ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
self.myCache = cache;
[cache release];
//設置緩存途徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
[self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
在AppDelegate.m中的dealloc辦法中添加以下語句
[myCache release];
到這裡為止,就完成了全局變量的聲明。
2、設置緩存戰略
在完成ASIHTTPRequest要求的處所設置request的存儲方法,代碼以下
NSString *str = @"http://....../getPictureNews.aspx";
NSURL *url = [NSURL URLWithString:str];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//獲得全局變量
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
//設置緩存方法
[request setDownloadCache:appDelegate.myCache];
//設置緩存數據存儲戰略,這裡采用的是假如無更新或沒法聯網就讀取緩存數據
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
request.delegate = self;
[request startAsynchronous];
3、清算緩存數據
我在這裡采取的是手動清算數據的方法,在恰當的處所添加以下代碼,我將清算緩寄存在了運用的設置模塊:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
這裡清算的是ASICachePermanentlyCacheStoragePolicy這類存儲戰略的緩存數據,假如改換其他的參數的話,便可清算對應存儲戰略的緩存數據。
【iOS體系緩存方面開辟的相干基本】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!