iOS網路開發(5)請求的緩衝

來源:互聯網
上載者:User

標籤:ios   app   xcode   網路編程   緩衝   消極式載入   

有網路請求的App有可能出現兩個問題:

    1)遇到網路不暢或資料量較大的情況下,會出現由於資料到達不及時使用不流暢的問題

    2)頻繁發送網路請求,可能造成沒必要的流量產生以及拖累手機速度的問題


針對問題一,通常採用的策略是:消極式載入大資料的請求

針對問題二,通常採用適當的緩衝策略,節省網路開銷


  • 消極式載入

在網路請求中,比較大的資源,片、視頻等,需要做一些特殊處理以提升App的效能

如以下情境:

     請求一個列表資料,每個資料包含:字串、圖片URL,tableView中需要顯示這些資料

     這裡設計到多次請求,第一個請求得到列表資料,之後多次請求下載所有圖片。

     如果當所有資料全部載入後再進行UI顯示,圖片的下載是非常耗時的,影響到App的體驗。


解決方案:

     當第一次請求獲得列表資料後,即將所有資料顯示出來,圖片顯示的位置顯示一個佔位圖片

     使用非同步網路請求下載圖片資源,當圖片被下載之後立刻更新UI進行處理


樣本說明:

    a. 發送一個GET請求資料獲一定數量的遊戲人物資訊

    650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/7C/B4/wKiom1bWhw7xRtELAAKVc8ezzQc209.png" title="螢幕快照 2016-03-02 下午2.23.59.png" width="601" height="420" border="0" hspace="0" vspace="0" style="width:601px;height:420px;" alt="wKiom1bWhw7xRtELAAKVc8ezzQc209.png" />

    b. UITableView的資料來源方法

    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7C/B4/wKiom1bWh2LBfMZYAADU5Lfnr88227.png" title="螢幕快照 2016-03-02 下午2.25.48.png" width="598" height="124" border="0" hspace="0" vspace="0" style="width:598px;height:124px;" alt="wKiom1bWh2LBfMZYAADU5Lfnr88227.png" /> 

        可以看到儲存格cell為其模型屬性heroModel賦值的內容是網路請求後的模型資料

    c. 儲存格模型屬性的setter方法

    先看未使用消極式載入前的代碼:

    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/7C/B2/wKioL1bWiLjCd_CkAAE8uCPdD48229.png" title="螢幕快照 2016-03-02 下午2.29.28.png" width="600" height="218" border="0" hspace="0" vspace="0" style="width:600px;height:218px;" alt="wKioL1bWiLjCd_CkAAE8uCPdD48229.png" />

        最後圖片的顯示,直接使用的同步方式請求,由於圖片資源較大,UI介面會出現卡頓的情況

    改用消極式載入後的代碼:

    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7C/B2/wKioL1bWinyxGgttAAKG28KAMVA448.png" title="螢幕快照 2016-03-02 下午2.36.58.png" width="701" height="461" border="0" hspace="0" vspace="0" style="width:701px;height:461px;" alt="wKioL1bWinyxGgttAAKG28KAMVA448.png" />

        先顯示一個佔位圖片,然後非同步請求圖片資源,請求完成後再顯示圖片

        這樣做,即使網路不暢或圖片較大時也不會出現UI介面卡頓的情況


  • 緩衝的引入

上面的解決方案,在一定情況下提升了使用者的體驗,但針對tableView來說,效能上可能還存在一定的問題:當tableView上下拖動過程中,會產生tableView的重用機制,意味著上面的代碼將會重複執行,也就意味著下載圖片的網路請求將重複發送


磁碟緩衝:

     在第一次請求時,將請求的結果儲存在本地,下一次發送同一請求時,直接從本地擷取緩衝即可

緩衝的使用:

     對於需要頻繁載入的資料,應使用本機快取

     對於伺服器經常會更新的資料,不應使用本機快取

     對於伺服器偶爾會更新的資料,應修改該緩衝策略


  • NSURLRequest的緩衝機制

在建立請求對象時可以指定使用的緩衝策略     

+ (instancetype)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval@property(readonly) NSURLRequestCachePolicy cachePolicyenum{     NSURLRequestUseProtocolCachePolicy = 0,     //使用協議的緩衝策略     NSURLRequestReloadIgnoringLocalCacheData = 1, //不使用本機快取     NSURLRequestReturnCacheDataElseLoad = 2,     //使用磁碟緩衝     NSURLRequestReturnCacheDataDontLoad = 3, //只使用磁碟緩衝,不進行網路載入};typedef NSUInteger NSURLRequestCachePolicy;


上面的消極式載入執行個體中:

    請求任務資料應當使用NSURLRequestReloadIgnoringLocalCacheData方式

    650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/7C/B4/wKiom1bWip7ARLvrAADrOI1ROLg787.png" title="螢幕快照 2016-03-02 下午2.39.38.png" width="651" height="98" border="0" hspace="0" vspace="0" style="width:651px;height:98px;" alt="wKiom1bWip7ARLvrAADrOI1ROLg787.png" />

    消極式載入圖片應使用NSURLRequestReturnCachedDataElseLoad方式:

    650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7C/B4/wKiom1bWijTBhbHJAAD2BCAbAu4718.png" title="螢幕快照 2016-03-02 下午2.37.53.png" width="647" height="87" border="0" hspace="0" vspace="0" style="width:647px;height:87px;" alt="wKiom1bWijTBhbHJAAD2BCAbAu4718.png" />


  • NSURLCache緩衝策略

請求的快取資料,通過NSURLCache管理

全域對象:   

+ (NSURLCache *)sharedURLCache

獲得緩衝對象

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

緩衝對象NSCachedURLResponse的屬性

@property(readonly, copy) NSData *data@property(readonly, copy) NSURLResponse *response

清理快取資料

- (void)removeCachedResponseForRequest:(NSURLRequest *)request- (void)removeAllCachedResponses

     App中通常需要,定期清理緩衝

通過NSURLCache對象可以管理緩衝的空間,緩衝的控制項可以是記憶體,也可以是磁碟

@property(readonly) NSUInteger currentDiskUsage@property NSUInteger diskCapacity@property(readonly) NSUInteger currentMemoryUsage@property NSUInteger memoryCapacity


樣本說明:

    在AppDelegate中添加代碼,每5分鐘檢測一次磁碟緩衝的佔用是否超過一半,如果是則發出緩衝需要清理的通知(當然,也可以直接進行清理)

    650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/7C/B4/wKiom1bWjb3w9tN3AAGnqtQMmgQ153.png" title="螢幕快照 2016-03-02 下午2.52.57.png" width="650" height="308" border="0" hspace="0" vspace="0" style="width:650px;height:308px;" alt="wKiom1bWjb3w9tN3AAGnqtQMmgQ153.png" />








本文出自 “安萌” 部落格,請務必保留此出處http://annmeng.blog.51cto.com/3321237/1746745

iOS網路開發(5)請求的緩衝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.