iOS Realm數(shù)據(jù)持久化--數(shù)據(jù)分頁(yè)與復(fù)用原理 (二)

上篇介紹了一些Realm數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)甩骏,本篇將介紹數(shù)據(jù)分頁(yè)與列表復(fù)用原理愚臀,希望對(duì)大家有所幫助瓦胎,如有錯(cuò)誤請(qǐng)指正秃踩。
iOS Realm數(shù)據(jù)持久化--Realm基礎(chǔ)知識(shí) (一)
iOS Realm數(shù)據(jù)持久化--數(shù)據(jù)分頁(yè)與復(fù)用原理 (二)
iOS Realm數(shù)據(jù)持久化--List容器分頁(yè)(三)
iOS Realm數(shù)據(jù)持久化--Realm集合分頁(yè)(四)

1、數(shù)據(jù)分頁(yè)

1.1 為何要分頁(yè)加載

隨著智能設(shè)備的普及买喧,信息以指數(shù)級(jí)增長(zhǎng)捻悯,移動(dòng)設(shè)備與后臺(tái)交互復(fù)雜度也不斷上升:
(1)移動(dòng)設(shè)備容納海量服務(wù)器數(shù)據(jù)。
(2)帶寬優(yōu)先淤毛、流量資源寶貴今缚,不適宜一次拉取過(guò)多的數(shù)據(jù)。
(3)設(shè)備性能不足低淡,一次載入過(guò)多數(shù)據(jù)會(huì)導(dǎo)致處理時(shí)間過(guò)長(zhǎng)荚斯,影響交互體驗(yàn)。
(4)設(shè)備內(nèi)存占用過(guò)多將會(huì)導(dǎo)致APP被系統(tǒng)Kill查牌。

要解決上述問(wèn)題事期,提高App交互體驗(yàn),我們需要做多方面的功課:
(1)客戶端限量依次拉取數(shù)據(jù)
(2)對(duì)數(shù)據(jù)壓縮編碼纸颜,減少冗余
(3)服務(wù)器節(jié)點(diǎn)和帶寬優(yōu)化

就客戶端而言主要還是解決數(shù)據(jù)冗余和拉取問(wèn)題兽泣,JSON是目前通用數(shù)據(jù)格式,解決冗余問(wèn)題只需減少無(wú)用字段即可(如果要求非常高可以使用非Http協(xié)議并采用二級(jí)制數(shù)據(jù)編碼胁孙,如protocolBuffer方案)唠倦,數(shù)據(jù)拉取則需要采用分頁(yè)方案解決:
(1)首次進(jìn)入App從服務(wù)器或者磁盤讀取最新的M條數(shù)據(jù),M不益過(guò)大
(2)瀏覽到第一條涮较,觸發(fā)分頁(yè)交互稠鼻,加載最新的M條數(shù)據(jù)到內(nèi)存
(3)瀏覽到最后一條數(shù)據(jù),觸發(fā)分頁(yè)交互狂票,加載之后的M條歷史數(shù)據(jù)到內(nèi)存
(4)響應(yīng)數(shù)據(jù)只提供基本概要候齿,避免將無(wú)用的內(nèi)容加載到內(nèi)存
(5)根據(jù)所在地區(qū)尋找最新的服務(wù)器節(jié)點(diǎn)提高訪問(wèn)速度

1.2 常見(jiàn)的分頁(yè)交互方案

分頁(yè)設(shè)計(jì)幾乎是聯(lián)網(wǎng)App的標(biāo)配,常見(jiàn)的有Feed流闺属、IM消息等慌盯,交互流程大致如下:

IM分頁(yè)(IM消息列表通常只有下拉刷新)
(1)進(jìn)入會(huì)話加載最新M條數(shù)據(jù)M通常為10-20
(2)滾動(dòng)到列表頂部觸發(fā)下拉刷新或者自動(dòng)加載M條歷史數(shù)據(jù)(通常使用timeStamp作為查詢標(biāo)志)
(3)發(fā)送文本掂器、圖片亚皂、位置等插入一條或多條新消息數(shù)據(jù)

Feed流分頁(yè)(Feed流通常包含上、下拉刷新或者只有上拉刷新等操作)
(1)進(jìn)入頁(yè)面加載最新M條數(shù)據(jù)国瓮,M通常為10-20
(2)滾動(dòng)到頁(yè)面底部觸發(fā)上拉刷新或者自動(dòng)加載M條歷史數(shù)據(jù)到內(nèi)存
(3)滾動(dòng)到頁(yè)面頂部觸發(fā)下拉刷新或者自動(dòng)加載最新M條數(shù)據(jù)到內(nèi)存

實(shí)際上很多App受復(fù)雜的數(shù)據(jù)緩存灭必、數(shù)據(jù)提取算法等影響狞谱,實(shí)際分頁(yè)策略不盡相同,但基礎(chǔ)交互并無(wú)差異禁漓,這里不做詳細(xì)討論跟衅。有興趣的可以去了解微信朋友圈微信聊天璃饱、新浪微博等分頁(yè)邏輯。

2肪康、表視圖

設(shè)計(jì)數(shù)據(jù)分頁(yè)不得不提到表視圖荚恶,表視圖是移動(dòng)開(kāi)發(fā)最重要的一章,使用極為頻繁磷支,CocoaTouch框架提供了UITableViewUICollectionView兩種類型的表視圖谒撼,使用簡(jiǎn)潔方便,熟練掌握好表視圖的相關(guān)特性和原理有助于我們更好的自定義表視圖雾狈。

2.1 為何要進(jìn)行數(shù)據(jù)復(fù)用

移動(dòng)設(shè)備的CPUGPU硬件配置和運(yùn)算性能遠(yuǎn)不如桌面電腦廓潜,早期的iOS設(shè)備只有256M內(nèi)存,可供App使用的不到30M善榛,超出這個(gè)限制App就會(huì)被系統(tǒng)殺掉辩蛋,目前最新的iOS設(shè)備如果內(nèi)存占用400M以上依然可能因?yàn)閮?nèi)存警告被系統(tǒng)Kill。為了減少內(nèi)存占用移盆,我們需要盡可能的利用已分配的資源來(lái)展示信息悼院,UITableViewUICollectionView正是基于此考慮采用了復(fù)用模式

2.2 復(fù)用的原理

UITableViewUICollectionView并非將每一個(gè)Item都綁定一個(gè)對(duì)應(yīng)的單元格Cell咒循,如果你非要這么干(棄用復(fù)用模式)据途,雖然數(shù)據(jù)可以正常顯示,但已背離了設(shè)計(jì)初衷叙甸,更糟糕的是過(guò)多的數(shù)據(jù)會(huì)導(dǎo)致同等量的Cell載入內(nèi)存颖医,并且列表滾動(dòng)時(shí)新的Cell不斷生成,內(nèi)存消耗也不斷增加裆蒸,App很快會(huì)變得卡頓然后被系統(tǒng)終結(jié)熔萧,這一定是你不愿意遇見(jiàn)的。

下圖展示了UITableViewCell的復(fù)用的基本原理(實(shí)際要復(fù)雜很多):

UITaleView復(fù)用原理.gif

如上圖僚祷,UITableView只在屏幕可見(jiàn)區(qū)域申請(qǐng)若干個(gè)UITableViewCell(具體申請(qǐng)數(shù)量跟Cell 的identifier也相關(guān)),滾動(dòng)的時(shí)候?qū)?code>Cell綁定新的數(shù)據(jù)源哪痰,這種設(shè)計(jì)可以保持內(nèi)存占用在一個(gè)較低的水平。

2.2 如何提高列表滾動(dòng)的流暢性

列表滾動(dòng)卡頓是一個(gè)很糟糕的體驗(yàn)久妆,應(yīng)該盡量避免以下操作:
(1)列表數(shù)據(jù)占用太多內(nèi)存資源晌杰,觸發(fā)內(nèi)存警告或App閃退
(2)消耗大量CPUGPU資源進(jìn)行界面渲染與繪制
(3)計(jì)算結(jié)果不做預(yù)緩存,每次復(fù)用都反復(fù)計(jì)算
(4)在主線程執(zhí)行耗時(shí)的任務(wù)

避免卡頓有助于提高列表滾動(dòng)流暢性筷弦,可以從以下幾個(gè)方面著手:
(1)減少界面渲染與繪制的資源消耗肋演,如優(yōu)化圓角與陰影抑诸,減少透明圖層,避免子視圖的反復(fù)申請(qǐng)爹殊,子線程異步處理蜕乡。
(2)緩存計(jì)算結(jié)果 ,避免對(duì)非動(dòng)態(tài)變化數(shù)據(jù)反復(fù)計(jì)算梗夸,如將高度层玲、格式化時(shí)間、富文本反症、轉(zhuǎn)換后的數(shù)據(jù)模型等做內(nèi)存緩存辛块。
(3)減少內(nèi)存占用,如采用分頁(yè)加載铅碍、懶加載润绵,緩存失效、單元格復(fù)用等胞谈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尘盼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烦绳,更是在濱河造成了極大的恐慌卿捎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件径密,死亡現(xiàn)場(chǎng)離奇詭異娇澎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)睹晒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門趟庄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伪很,你說(shuō)我怎么就攤上這事戚啥。” “怎么了锉试?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵猫十,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我呆盖,道長(zhǎng)拖云,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任应又,我火速辦了婚禮宙项,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘株扛。我一直安慰自己尤筐,他們只是感情好汇荐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盆繁,像睡著了一般掀淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油昂,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天革娄,我揣著相機(jī)與錄音,去河邊找鬼冕碟。 笑死拦惋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸣哀。 我是一名探鬼主播架忌,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吞彤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼我衬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饰恕,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挠羔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后埋嵌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體破加,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年雹嗦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了范舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡了罪,死狀恐怖锭环,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泊藕,我是刑警寧澤辅辩,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站娃圆,受9級(jí)特大地震影響玫锋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讼呢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一撩鹿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悦屏,春花似錦三痰、人聲如沸吧寺。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稚机。三九已至,卻和暖如春获搏,著一層夾襖步出監(jiān)牢的瞬間赖条,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工常熙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纬乍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓裸卫,卻偏偏與公主長(zhǎng)得像仿贬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墓贿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容