一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS中的NSURLCache數據緩存類用法解析

iOS中的NSURLCache數據緩存類用法解析

2021-01-21 15:14琿少 IOS

iOS App中具體緩存操作的管理我們通常是用NSURLCache類來實現的,下面我們就來看一下iOS中的NSURLCache數據緩存類用法解析:

 在IOS應用程序開發中,為了減少與服務端的交互次數,加快用戶的響應速度,一般都會在IOS設備中加一個緩存的機制。使用緩存的目的是為了使用的應用程序能更快速的響應用戶輸入,是程序高效的運行。有時候我們需要將遠程web服務器獲取的數據緩存起來,減少對同一個url多次請求。下面將介紹如何在IOS設備中進行緩存。

 內存緩存我們可以使用sdk中的NSURLCache類。NSURLRequest需要一個緩存參數來說明它請求的url何如緩存數據的,我們先看下它的CachePolicy類型。
 
 1、NSURLRequestUseProtocolCachePolicy NSURLRequest默認的cache policy,使用Protocol協議定義。
 
 2、NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載。
 
 3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載。
 
 4、NSURLRequestReturnCacheDataDontLoad 只使用cache數據,如果不存在cache,請求失敗;用于沒有建立網絡連接離線模式;
 
 5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和遠程的緩存數據,直接從原始地址下載,與NSURLRequestReloadIgnoringCacheData類似。
 
 6、NSURLRequestReloadRevalidatingCacheData:驗證本地數據與遠程數據是否相同,如果不同則下載遠程數據,否則使用本地數據。

 

 一些常用方法與屬性:
 //獲取當前應用的緩存管理對象
+ (NSURLCache *)sharedURLCache;
//設置自定義的NSURLCache作為應用緩存管理對象
+ (void)setSharedURLCache:(NSURLCache *)cache;
//初始化一個應用緩存對象
/*
memoryCapacity 設置內存緩存容量
diskCapacity 設置磁盤緩存容量
path 磁盤緩存路徑
內容緩存會在應用程序退出后 清空 磁盤緩存不會
*/
- (instancetype)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(nullable NSString *)path;
//獲取某一請求的緩存
- (nullable NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
//給請求設置指定的緩存
- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;
//移除某個請求的緩存
- (void)removeCachedResponseForRequest:(NSURLRequest *)request;
//移除所有緩存數據
- (void)removeAllCachedResponses;
//移除某個時間起的緩存設置
- (void)removeCachedResponsesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);
//內存緩存容量大小
@property NSUInteger memoryCapacity;
//磁盤緩存容量大小
@property NSUInteger diskCapacity;
//當前已用內存容量
@property (readonly) NSUInteger currentMemoryUsage;
//當前已用磁盤容量
@property (readonly) NSUInteger currentDiskUsage;

 

簡單例子:

#import

@interface ViewController : UIViewController

@property (strong, nonatomic) NSURLConnection *connection;
@property (strong, nonatomic) NSURLCache *urlCache;
@property (strong, nonatomic) NSURL *url;
@property (strong, nonatomic) NSMutableURLRequest *request;

- (IBAction)reloadWebView:(UIButton *)sender;

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *paramURLAsString= @"http://blog.sina.com.cn/u/2526279194";
    self.urlCache = [NSURLCache sharedURLCache];
  
    [self.urlCache setMemoryCapacity:1*1024*1024];
    //創建一個nsurl
    self.url = [NSURL URLWithString:paramURLAsString];
    //創建一個請求
    self.request=[NSMutableURLRequest requestWithURL:self.url
                                                   cachePolicy:NSURLRequestUseProtocolCachePolicy
                                   timeoutInterval:30.0f];
    [self.myWebView loadRequest:self.request];
}

 
這個例子中,我們請求url為http://blog.sina.com.cn/u/2526279194的網站。如果這個url被緩存了,我們直接從緩存中獲取數據,否則從http://blog.sina.com.cn/u/2526279194站點上重新獲取數據。我們設置了緩存大小為1M。


- (IBAction)reloadWebView:(UIButton *)sender {

    //從請求中獲取緩存輸出
    NSCachedURLResponse *response =[self.urlCache cachedResponseForRequest:self.request];
    //判斷是否有緩存
    if (response != nil){
        NSLog(@"如果有緩存輸出,從緩存中獲取數據");
        [self.request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
    }
    [self.myWebView loadRequest:self.request];
   
    self.connection = nil;
  
    NSURLConnection *newConnection = [[NSURLConnection alloc] initWithRequest:self.request
                                                                     delegate:self
                                                             startImmediately:YES];
    self.connection = newConnection;
}

使用下面代碼,我將請求的過程打印出來
- (void)  connection:(NSURLConnection *)connection
  didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"將接收輸出");
}
- (NSURLRequest *)connection:(NSURLConnection *)connection
             willSendRequest:(NSURLRequest *)request
            redirectResponse:(NSURLResponse *)redirectResponse{
    NSLog(@"即將發送請求");
    return(request);
}
- (void)connection:(NSURLConnection *)connection
    didReceiveData:(NSData *)data{
    NSLog(@"接受數據");
    NSLog(@"數據長度為 = %lu", (unsigned long)[data length]);
}
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse{
    NSLog(@"將緩存輸出");
    return(cachedResponse);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"請求完成");
}
- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error{
    NSLog(@"請求失敗");
}

@end

第一次打印結果如下
 

?
1
2
3
4
5
6
7
8
9
10
2013-01-31 15:28:29.923 NSURLCacheDemo[27848:907] 即將發送請求
2013-01-31 15:28:30.043 NSURLCacheDemo[27848:907] 將接收輸出
2013-01-31 15:28:30.045 NSURLCacheDemo[27848:907] 接受數據
2013-01-31 15:28:30.047 NSURLCacheDemo[27848:907] 數據長度為 = 30047
2013-01-31 15:28:30.095 NSURLCacheDemo[27848:907] 接受數據
2013-01-31 15:28:30.098 NSURLCacheDemo[27848:907] 數據長度為 = 3575
2013-01-31 15:28:30.102 NSURLCacheDemo[27848:907] 接受數據
2013-01-31 15:28:30.104 NSURLCacheDemo[27848:907] 數據長度為 = 1482
2013-01-31 15:28:30.105 NSURLCacheDemo[27848:907] 將緩存輸出
2013-01-31 15:28:30.107 NSURLCacheDemo[27848:907] 請求完成

第二次點擊打印結果如下

?
1
2
3
4
5
6
2013-01-31 15:28:31.599 NSURLCacheDemo[27848:907] 如果有緩存輸出,從緩存中獲取數據
2013-01-31 15:28:31.607 NSURLCacheDemo[27848:907] 即將發送請求
2013-01-31 15:28:31.840 NSURLCacheDemo[27848:907] 將接收輸出
2013-01-31 15:28:31.843 NSURLCacheDemo[27848:907] 接受數據
2013-01-31 15:28:31.845 NSURLCacheDemo[27848:907] 數據長度為 = 35104
2013-01-31 15:28:31.846 NSURLCacheDemo[27848:907] 請求完成

我們看到沒有“將緩存輸出”一項,請求到的數據是第一次請求的累積,也就是第二次是從內存中獲取數據的。

延伸 · 閱讀

精彩推薦
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
主站蜘蛛池模板: 猥琐对着美女飞机喷到脸上 | 日韩精品一区二区三区中文字幕 | 国产精品久久久久影院色老大 | 久久亚洲精品中文字幕60分钟 | 久久青青草原综合伊人 | 无码国产成人777爽死 | chinese国产人妖hd | 国产99久久久国产精品成人 | 欧美国产在线视频 | 91次元成年破解版 | 猫咪色网| 小柔的性放荡羞辱日记动漫 | 亚洲国产免费观看视频 | 亚洲精品久久中文字幕 | 亚洲日韩欧美一区二区在线 | 丝袜美女被艹 | 国产欧美综合精品一区二区 | 调教女警花穿环上班 | 欧美日韩视频一区三区二区 | 欧美性一区二区三区 | 胸奶好大好紧好湿好爽 | 91麻豆精品国产自产在线 | 好大好硬好深好爽gif图 | 男人j进女屁股视频在线观看 | 色老板最新网站视频地址 | 深夜免费在线视频 | 出a级黑粗大硬长爽猛视频 吃胸膜奶视频456 | 韩日理论片 | h版小说 | 17个农民工婉莹第一部 | 九九国产在线观看 | 亚洲AV无码国产精品午夜久久 | 国产情侣露脸自拍 | 91入口免费网站大全 | 女攻双性 | 日本厕所spy2wc | 日日碰碰 | 亚洲va欧美va天堂v国产综合 | 激情视频在线播放 | 99久久久久久久 | 34看网片午夜理 |