溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存

發(fā)布時(shí)間:2020-07-23 11:06:26 來(lái)源:網(wǎng)絡(luò) 閱讀:1354 作者:ymanmeng123 欄目:移動(dòng)開(kāi)發(fā)

有網(wǎng)絡(luò)請(qǐng)求的App有可能出現(xiàn)兩個(gè)問(wèn)題:

    1)遇到網(wǎng)絡(luò)不暢或數(shù)據(jù)量較大的情況下,會(huì)出現(xiàn)由于數(shù)據(jù)到達(dá)不及時(shí)使用不流暢的問(wèn)題

    2)頻繁發(fā)送網(wǎng)絡(luò)請(qǐng)求,可能造成沒(méi)必要的流量產(chǎn)生以及拖累手機(jī)速度的問(wèn)題


針對(duì)問(wèn)題一,通常采用的策略是:延遲加載大數(shù)據(jù)的請(qǐng)求

針對(duì)問(wèn)題二,通常采用適當(dāng)?shù)木彺娌呗?,?jié)省網(wǎng)絡(luò)開(kāi)銷


  • 延遲加載

在網(wǎng)絡(luò)請(qǐng)求中,比較大的資源,如圖片、視頻等,需要做一些特殊處理以提升App的性能

如以下場(chǎng)景:

     請(qǐng)求一個(gè)列表數(shù)據(jù),每個(gè)數(shù)據(jù)包含:字符串、圖片URL,tableView中需要顯示這些數(shù)據(jù)

     這里設(shè)計(jì)到多次請(qǐng)求,第一個(gè)請(qǐng)求得到列表數(shù)據(jù),之后多次請(qǐng)求下載所有圖片。

     如果當(dāng)所有數(shù)據(jù)全部加載后再進(jìn)行UI顯示,圖片的下載是非常耗時(shí)的,影響到App的體驗(yàn)。


解決方案:

     當(dāng)?shù)谝淮握?qǐng)求獲得列表數(shù)據(jù)后,即將所有數(shù)據(jù)顯示出來(lái),圖片顯示的位置顯示一個(gè)占位圖片

     使用異步的網(wǎng)絡(luò)請(qǐng)求下載圖片資源,當(dāng)圖片被下載之后立刻更新UI進(jìn)行處理


示例說(shuō)明:

    a. 發(fā)送一個(gè)GET請(qǐng)求數(shù)據(jù)獲一定數(shù)量的游戲人物信息

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存

    b. UITableView的數(shù)據(jù)源方法

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存 

        可以看到單元格cell為其模型屬性heroModel賦值的內(nèi)容是網(wǎng)絡(luò)請(qǐng)求后的模型數(shù)據(jù)

    c. 單元格模型屬性的setter方法

    先看未使用延遲加載前的代碼:

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存

        最后圖片的顯示,直接使用的同步方式請(qǐng)求,由于圖片資源較大,UI界面會(huì)出現(xiàn)卡頓的情況

    改用延遲加載后的代碼:

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存

        先顯示一個(gè)占位圖片,然后異步請(qǐng)求圖片資源,請(qǐng)求完成后再顯示圖片

        這樣做,即使網(wǎng)絡(luò)不暢或圖片較大時(shí)也不會(huì)出現(xiàn)UI界面卡頓的情況


  • 緩存的引入

上面的解決方案,在一定情況下提升了用戶的體驗(yàn),但針對(duì)tableView來(lái)說(shuō),性能上可能還存在一定的問(wèn)題:當(dāng)tableView上下拖動(dòng)過(guò)程中,會(huì)產(chǎn)生tableView的重用機(jī)制,意味著上面的代碼將會(huì)重復(fù)執(zhí)行,也就意味著下載圖片的網(wǎng)絡(luò)請(qǐng)求將重復(fù)發(fā)送


磁盤(pán)緩存:

     在第一次請(qǐng)求時(shí),將請(qǐng)求的結(jié)果存儲(chǔ)在本地,下一次發(fā)送同一請(qǐng)求時(shí),直接從本地獲取緩存即可

緩存的使用:

     對(duì)于需要頻繁加載的數(shù)據(jù),應(yīng)使用本地緩存

     對(duì)于服務(wù)器經(jīng)常會(huì)更新的數(shù)據(jù),不應(yīng)使用本地緩存

     對(duì)于服務(wù)器偶爾會(huì)更新的數(shù)據(jù),應(yīng)修改該緩存策略


  • NSURLRequest的緩存機(jī)制

在創(chuàng)建請(qǐng)求對(duì)象時(shí)可以指定使用的緩存策略     

+ (instancetype)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
@property(readonly) NSURLRequestCachePolicy cachePolicy
enum{
     NSURLRequestUseProtocolCachePolicy = 0,     //使用協(xié)議的緩存策略
     NSURLRequestReloadIgnoringLocalCacheData = 1, //不使用本地緩存
     NSURLRequestReturnCacheDataElseLoad = 2,     //使用磁盤(pán)緩存
     NSURLRequestReturnCacheDataDontLoad = 3, //只使用磁盤(pán)緩存,不進(jìn)行網(wǎng)絡(luò)加載
};
typedef NSUInteger NSURLRequestCachePolicy;


上面的延遲加載實(shí)例中:

    請(qǐng)求任務(wù)數(shù)據(jù)應(yīng)當(dāng)使用NSURLRequestReloadIgnoringLocalCacheData方式

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存

    延遲加載圖片應(yīng)使用NSURLRequestReturnCachedDataElseLoad方式:

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存


  • NSURLCache緩存策略

請(qǐng)求的緩存數(shù)據(jù),通過(guò)NSURLCache管理

全局對(duì)象:   

+ (NSURLCache *)sharedURLCache

獲得緩存對(duì)象

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

緩存對(duì)象NSCachedURLResponse的屬性

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

清理緩存數(shù)據(jù)

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

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

通過(guò)NSURLCache對(duì)象可以管理緩存的空間,緩存的控件可以是內(nèi)存,也可以是磁盤(pán)

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


示例說(shuō)明:

    在AppDelegate中添加代碼,每5分鐘檢測(cè)一次磁盤(pán)緩存的占用是否超過(guò)一半,如果是則發(fā)出緩存需要清理的通知(當(dāng)然,也可以直接進(jìn)行清理)

    iOS網(wǎng)絡(luò)開(kāi)發(fā)(5)請(qǐng)求的緩存








向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI