LazyScrollView 簡單看

LazyScrollView 是一個高性能的 scrollView 重用布局框架, 實現(xiàn)了視圖的重用和自動加載, 值得學(xué)習(xí)一二

使用的時候的核心代碼分析

@protocol TMMuiLazyScrollViewDataSource <NSObject>
@required
- (NSUInteger)numberOfItemInScrollView:(nonnull TMMuiLazyScrollView *)scrollView; // 0 by default.

// Return the view model by spcial index.
- (nonnull TMMuiRectModel *)scrollView:(nonnull TMMuiLazyScrollView *)scrollView
                      rectModelAtIndex:(NSUInteger)index;

/**
 * You should render the item view here. And the view is probably . Item view display. You should
 * *always* try to reuse views by setting each view's reuseIdentifier and querying for available
 * reusable views with dequeueReusableItemWithIdentifier:
 */
- (nullable UIView *)scrollView:(nonnull TMMuiLazyScrollView *)scrollView itemByMuiID:(nonnull NSString *)muiID;

@end

我們從上面這個代理中就可以大致得到一些信息

  1. scrollView 重用顯示是通過 delegate 來完成的
  2. 我們需要為每個 item 返回一個 TMMuiRectModel
  3. 我們需要通過 id 自行配置對應(yīng)的 view(在這里需要注意的是獲取 view 需要調(diào)用 scrollView 的方法)

那么 TMMuiRectModel 是個什么呢, 我們通過源碼知道它只是一個布局屬性, 不過未來要是能加上一些層級顯示的相關(guān)屬性就更好了, 因為視圖有可能疊加在一起

@interface TMMuiRectModel: NSObject

// A rect that relative to the scroll view.
@property (nonatomic, assign) CGRect absoluteRect;

// A uniq string that identify a model.
@property (nonatomic, copy, nonnull) NSString *muiID;

@end

那么看了這么多, 在沒有看更多代碼的情況下, 我們來猜想一下具體的實現(xiàn)方式吧

  1. 我們在加載視圖的時候, 會遍歷所有的 rect, 計算已經(jīng)顯示或者將要顯示的 id
  2. 在計算顯示的 id 的時候, 同時也要計算消失的 id
  3. 獲取顯示的 id 對應(yīng)的 view, 并且把他們放到 view 上

簡單的說流程也就是這樣了, 但是如何保證性能和正確性, 這個我們就要在更細(xì)致的學(xué)習(xí)源碼了

更細(xì)致的流程

  1. 我們要緩存所有的布局信息, 但是在面對 scrollView 滑動的方向不確定的情況下, lazy 有緩存了兩個方向的所有索引 modelsSortedByTop 和 modelsSortedByBottom, 這樣的話在滑動的時候我們就不需要每次全局遍歷了
  2. 第二部就是裝配所有的 cell
    2.1 首先是得到一個顯示范圍, 然后得到這里面應(yīng)該顯示的 id 集合(通過上面的到的索引獲取, 這里使用的了二分法)
    2.2 然后根據(jù) id 的集合處理目前已經(jīng)顯示的 view, 值得一提的是 view 的兩個附加 id, reuseIdentifier 是用來處理重用顯示的, muiID 是唯一 id, reuseIdentifier 為 空的 view 并不會做額外的處理操作
    2.3 之后就要處理真正要顯示的 cell 了 -- 還未顯示的 cell 和 需要重載的 cell, 通過代理獲取對應(yīng)的 view, 并且返回就好
  3. lazy 做了一些統(tǒng)計操作, 能記錄 cell 的出現(xiàn)次數(shù), 原理是每次緩存上一次未出現(xiàn)的 cell id, 如果這一次出現(xiàn), time + 1

關(guān)于 cell, lazy 還寫了一個 協(xié)議來記錄處理 cell view

@protocol  TMMuiLazyScrollViewCellProtocol<NSObject>

@optional
// if call dequeueReusableItemWithIdentifier to get a reuseable view,the same as "prepareForReuse" in UITableViewCell
- (void)mui_prepareForReuse;
// When view enter the visible area of LazyScrollView ,call this method.
// First 'times' is 0
- (void)mui_didEnterWithTimes:(NSUInteger)times;
// When we need render the view, call this method.
// The difference between this method and 'mui_didEnterWithTimes' is there is a buffer area in LazyScrollView(RenderBufferWindow), first we will call 'mui_afterGetView'.
- (void)mui_afterGetView;

@end

關(guān)于 性能問題, 不僅用到了索引, 還使用了刷新閾值, 在 scrollViewDidScroll 代理中移動超過閾值的時候才會刷新 UI, 檢查 布局

后記

我感覺還是有一些可以優(yōu)化的點的

  1. 視圖的層級優(yōu)先級問題
  2. 目前只支持 Y 軸的重用加載, 未來可以加入多個方向的
  3. 目前對重用還只是很初級的使用, 未來希望能有更加多樣化的 api
  4. 可以根據(jù)移動速度,方向進行預(yù)加載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赖条,一起剝皮案震驚了整個濱河市充蓝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锚沸,老刑警劉巖跋选,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哗蜈,居然都是意外死亡前标,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門距潘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼列,“玉大人,你說我怎么就攤上這事音比〈眩” “怎么了烘贴?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我工秩,道長看成,這世上最難降的妖魔是什么炕淮? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任鉴竭,我火速辦了婚禮,結(jié)果婚禮上循未,老公的妹妹穿的比我還像新娘陷猫。我一直安慰自己,他們只是感情好的妖,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布绣檬。 她就那樣靜靜地躺著,像睡著了一般嫂粟。 火紅的嫁衣襯著肌膚如雪娇未。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天星虹,我揣著相機與錄音零抬,去河邊找鬼镊讼。 笑死,一個胖子當(dāng)著我的面吹牛平夜,可吹牛的內(nèi)容都是我干的蝶棋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼忽妒,長吁一口氣:“原來是場噩夢啊……” “哼玩裙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起段直,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吃溅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸯檬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體决侈,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年京闰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甩苛。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹂楣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讯蒲,到底是詐尸還是另有隱情痊土,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布墨林,位于F島的核電站赁酝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旭等。R本人自食惡果不足惜酌呆,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搔耕。 院中可真熱鬧隙袁,春花似錦、人聲如沸弃榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲸睛。三九已至娜饵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官辈,已是汗流浹背箱舞。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工遍坟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褐缠。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓政鼠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親队魏。 傳聞我的和親對象是個殘疾皇子公般,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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