你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS體系緩存方面開辟的相干基本

iOS體系緩存方面開辟的相干基本

編輯:IOS開發綜合

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體系緩存方面開辟的相干基本】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved