許多 App 都有用戶系統(tǒng),不論是自己實(shí)現(xiàn)還是使用第三方,大概都需要顯示用戶的頭像。比較常見的情景下,頭像會(huì)在某些列表里出現(xiàn),例如聯(lián)系人列表、消息列表等。
雖然頭像也是圖像,但相比于普通圖片,我們對(duì)頭像有更高的要求。
頭像的原始圖片可能有各種尺寸,但在 App 里,我們很可能需要某種固定樣式的頭像,例如正方形或者圓形。如果我們使用通用的圖片緩存工具如 SDWebImage、Kingfisher 等,那么還需要自己做圖片的裁剪和加工。如果直接用 UIImageView 來縮小,圖片細(xì)節(jié)就會(huì)變得過于“銳利”,影響觀看。
進(jìn)一步,一個(gè) App 里可能不只有一種頭像樣式。比如某些場(chǎng)景里要有大頭像,某些要用小頭像,某些要用原始尺寸的頭像;或者某些場(chǎng)景里要用正方形頭像,某些場(chǎng)景里要用圓角矩形頭像,不一而足。注意:?jiǎn)渭冇?layer.cornerRadius 或 CALayer 來 mask 都會(huì)導(dǎo)致列表的滑動(dòng)性能問題,因此不考慮。
如果要做優(yōu)化,我們當(dāng)然希望這些不同樣式的小頭像能夠存儲(chǔ)在本地,不用再?gòu)木W(wǎng)絡(luò)獲取再裁減或處理樣式。一來減少不需要的流量消耗,二來提高頭像載入速度,用戶體驗(yàn)自然會(huì)更好。
基于上述分析,我們來設(shè)計(jì)一個(gè)頭像緩存系統(tǒng)。它的目標(biāo)是快速地獲取并緩存有樣式的頭像圖片,并能比較容易地集成到已有項(xiàng)目中。
一些前提:
好了,我們來做一做思維游戲。
首先,已有的用戶模型可能為: