iOS開發網絡篇—數據緩存

iOS開發網絡篇—數據緩存

一、關于同一個URL的多次請求

  有時候,對同一個URL請求多次,返回的數據可能都是一樣的,比如服務器上的某張圖片,無論下載多少次,返回的數據都是一樣的。

  

  上面的情況會造成以下問題

(1)用戶流量的浪費

(2)程序響應速度不夠快

解決上面的問題,一般考慮對數據進行緩存。

?

?二、緩存

  為了提高程序的響應速度,可以考慮使用緩存(內存緩存\硬盤緩存)

  

  第一次請求數據時,內存緩存中沒有數據,硬盤緩存中沒有數據。

緩存數據的過程

  

當服務器返回數據時,需要做以下步驟

(1)使用服務器的數據(比如解析、顯示)

(2)將服務器的數據緩存到硬盤(沙盒)

此時緩存的情況是:內存緩存中有數據,硬盤緩存中有數據。

再次請求數據分為兩種情況:

(1)如果程序并沒有被關閉,一直在運行

  那么此時內存緩存中有數據,硬盤緩存中有數據。如果此時再次請求數據,直接使用內存緩存中的數據即可

(2)如果程序重新啟動

  那么此時內存緩存已經消失,沒有數據,硬盤緩存依舊存在,還有數據。如果此時再次請求數據,需要讀取內存中緩存的數據。

提示:從硬盤緩存中讀取數據后,內存緩存中又有數據了

?

三、緩存的實現

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)偶爾更新:可以定期更改緩存策略 或者 清除緩存

提示:如果大量使用緩存,會越積越大,建議定期清除緩存

?

四、簡單的代碼示例

復制代碼
 1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event2 {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];
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  }
39  */
復制代碼

轉載于:https://www.cnblogs.com/fakeCoder/p/5522322.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[WinError 10061] 由于目標計算機積極拒絕,無法連接錯誤解決辦法

爬蟲的時候會經常出現"[WinError 10061] 由于目標計算機積極拒絕,無法連接"錯誤這種情況,有可能是LAN口設置不正確 我是在爬取全國天氣情況的時候出現的這種錯誤,后面調了以后可以了1.控制面板——網絡和 Internet—— Internet選項…

Chrome瀏覽器設置小窗口視頻

快捷工具先安裝1.28版本后用1.31版本替換,以實現視頻彈窗和雙擊關閉標簽頁功能。 首先下載Chrome擴展快捷工具1.28版的CRX安裝包:http://pan.baidu.com/s/1pJ4T4td; 然后拖放到chrome擴展管理頁面中安裝。 接著,下載打包好的快捷…

這門課有什么用?

每個老師都苦惱于學生常問的問題:“某某課學了有什么用?”老師費勁巴拉解釋一通,結果還是:然并卵。 一門課有什么用,很難解釋得令人信服,因為這和人的認知水平有關。認知水平達不到,解釋的多深入…

NO.1_python_scrapy組成爬取多頁數據連接數據庫配置文件書寫

scrapy框架組成及各部分作用 item pipelines: 用于存放需要存儲數據的數據模型,一般格式為: #需要存儲多少中類型的數據就寫多少行,一般是key_value組合 數據名稱,即key scrapy.Field()spiders 用于解析返回來的response im…

“智云大咖秀”:大咖攝影師談驚艷亮相的“大咖級”設備

古人云,善書者不擇筆。 古人又云,工欲善其事必先利其器。 古人很矛盾。 這兩句話如果用在影像創作這個領域,可以說都有道理:沒有好的設備,創意大師一樣能夠拍出足夠驚艷的作品;有足夠強的設備,但…

英語 用on還是/at/還是in

in prep. 1. [表示地點、場所、位置等]在…里面;在…內部;在…上:例句: in the room 在房間里 2. [表示時間]在…期間;在(一段時間)以內;過…之久:例句: in summer 在夏天in 3. [表示狀態]在…狀態中&…

js編寫簡易返回頂部按鈕

之前ui設計讓我做個返回頂部的按鈕,我一定頭緒都沒,感覺真要加上這個功能,自己編寫就得一個下午,工作量大為由,所以就推脫了; 當靜下心,有時間搗鼓之后才發現原來so easy!!! 以下是我的js代碼,不足之處還請博友們批評指正; //原生js操作代碼  function scrolls(){   v…

NO.2_python_scrapy_反爬蟲(隨機請求頭IP代理)取消鏈接去重

1.隨機請求頭 # -*- coding: utf-8 -*- """ 所有請求頭的USER_AGENTS網址 http://www.useragentstring.com/pages/useragentstring.php?nameAll """ import json import random import requestsUSER_AGENTS [Mozilla/5.0 (Windows NT 10.0; W…

Cobub無碼埋點關鍵技術的實現

隨著大數據時代的到來,數據采集也已經變的越來越重要。前端埋點作為一個比較成熟的數據接入手段被廣泛應用著。目前埋點分為兩種方式,有碼與無碼埋點。有碼埋點比較容易理解,即調用SDK的API,在代碼中插入埋點的相關代碼&#xff0…

Dedesql數據庫類詳解(二次開發必備教程)(轉)

http://www.dedecms.com/help/development/2009/1028/1076.html 織夢DedeCMS的二次開發不僅僅是會寫寫織夢的標簽,會制作織夢的模板。很多時候,我們需要對織夢DedeCMS的數據庫進行查詢、插入、刪除等等之類的操作,進行這一類的操作之前&#…

裝系統換固態硬盤方法

1、將買回的固態硬盤直接換上電腦的原先機械硬盤 2、或者將自己的光驅拆卸,將固態硬盤裝上去 3、電腦進入boss 界面,找到boot(引導)欄,找到自己的u盤,進入后先分區,然后再重啟, 然后再進入BOSS進入U盤里&…

學習筆記(02):Python網絡編程并發編程-assert斷言的用途

立即學習:https://edu.csdn.net/course/play/24458/296228?utm_sourceblogtoedu 異常處理 1.異常的捕捉 try:正常需要運行的代碼except 可能出現的錯誤 as e:出現這種錯誤需要運行的代碼...except Exception as e:捕捉未知的錯誤,并且將需要運行的代碼放于此處el…

ionic tab顯示到頂部去了

添加配置調整顯示位置 .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) {$ionicConfigProvider.platform.ios.tabs.style(standard);$ionicConfigProvider.platform.ios.tabs.position(bottom);$ionicConfigProvider.platform.android.tabs.style(…

EasyUI加載外部頁面需要使用html片段

最后總結&#xff0c;如果使用easyui中加載外部界面的組件&#xff0c;例如&#xff1a;panel,window&#xff0c;dailog,tabs等。請確保引入的界面是一個html片段。html片段正確的寫法再次提醒不要出現<html><head><body>三個標簽。 http://www.cnblogs.com…

留言板

本軟件是作為部門內員工之間留言及發送消息使用。 系統必須通過口令驗證&#xff0c;登錄進入。方法是從數據庫內取出用戶姓名和口令的數據進行校驗。 系統包含四部分功能 1 登錄&#xff1a;驗證用戶名與口令&#xff0c;保存會話信息&#xff0c;進入主界面。 界面顯示代碼 &…

c++的32位和64位類型符的位數

看一下結果&#xff1a;WIN32下&#xff1a;sizeof(char):1sizeof(short):2sizeof(int):4sizeof(long):4sizeof(long long):8sizeof(unsigned int):4sizeof(float):4sizeof(double):8sizeof(pointer):4請按任意鍵繼續. . .x64下&#xff1a;sizeof(char):1sizeof(short):2sizeo…

ORA-00980與PL/SQL程序編譯出錯

今天碰到一個有意思的問題。為了降低統計分析數據庫的計算和磁盤空間壓力。我們使用了將遠程數據庫中數據通過DBLINK和SYNONYM的形式來緩解當前統計數據庫所面臨的問題。工作實施的比較順利。但是統計人員發現有幾個執行統計的PL/SQL過程和包&#xff08;PACKAGE&#xff09;失…

學習筆記(03):Python實戰編程-sys模塊

立即學習:https://edu.csdn.net/course/play/19711/255505?utm_sourceblogtoedu sys是一個系統的環境交互模塊&#xff0c;是唯一一個可以與操作系統有關的模塊 #codingutf-8 import sysprint(sys.modules) print(sys.)

spring+mybatis實現讀寫分離

springmore-core springibatis實現讀寫分離 特點 無縫結合springibatis&#xff0c;對于程序員來說&#xff0c;是透明的 除了修改配置信息之外&#xff0c;程序的代碼不需要修改任何東西 支持spring的容器事務規則:基于spring配置的容器事務讀寫事務到主庫只讀事務到從庫如果沒…

DEV C++如何不需要通過建項目可以調試程序

1點擊文件 2、開始寫一段類的程序 #include<iostream>using namespace std;class Point //點類定義 { int x,y; //點的x和y坐標public: void lnitPoint(int,int); //設置坐標 int GetX(){ return x;} //取x坐標 int GetY() {return y;} //取y坐標 void …