標籤: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的重用機制,意味著上面的代碼將會重複執行,也就意味著下載圖片的網路請求將重複發送
磁碟緩衝:
在第一次請求時,將請求的結果儲存在本地,下一次發送同一請求時,直接從本地擷取緩衝即可
緩衝的使用:
對於需要頻繁載入的資料,應使用本機快取
對於伺服器經常會更新的資料,不應使用本機快取
對於伺服器偶爾會更新的資料,應修改該緩衝策略
在建立請求對象時可以指定使用的緩衝策略
+ (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 *)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)請求的緩衝