9
UICollectionViewCell的的優(yōu)化
在iOS 10 之前,UICollectionView上面如果有大量cell,當用戶活動很快的時候,整個UICollectionView的卡頓會很明顯,為什么會造成這樣的問題,這里涉及到了iOS 系統(tǒng)的重用機制,當cell準備加載進屏幕的時候,整個cell都已經(jīng)加載完成,等待在屏幕外面了,也就是整整一行cell都已經(jīng)加載完畢,這就是造成卡頓的主要原因,專業(yè)術語叫做:掉幀.
要想讓用戶感覺不到卡頓,我們的app必須幀率達到60幀/秒,也就是說每幀16毫秒要刷新一次.
10
之前UICollectionViewCell的生命周期是這樣的:
1.用戶滑動屏幕,屏幕外有一個cell準備加載進來,把cell從reusr隊列拿出來,然后調(diào)用prepareForReuse方法,在這個方法里面,可以重置cell的狀態(tài),加載新的數(shù)據(jù);
2.繼續(xù)滑動,就會調(diào)用cellForItemAtIndexPath方法,在這個方法里面給cell賦值模型,然后返回給系統(tǒng);
3.當cell馬上進去屏幕的時候,就會調(diào)用willDisplayCell方法,在這個方法里面我們還可以修改cell,為進入屏幕做最后的準備工作;
4.執(zhí)行完willDisplayCell方法后,cell就進去屏幕了.當cell完全離開屏幕以后,會調(diào)用didEndDisplayingCell方法.
UICollectionViewCell的生命周期是這樣的:
1.用戶滑動屏幕,屏幕外有一個cell準備加載進來,把cell從reusr隊列拿出來,然后調(diào)用prepareForReuse方法,在這里當cell還沒有進去屏幕的時候,就已經(jīng)提前調(diào)用這個方法了,對比之前的區(qū)別是之前是cell的上邊緣馬上進去屏幕的時候就會調(diào)用該方法,而iOS 10 提前到cell還在屏幕外面的時候就調(diào)用;
2.在cellForItemAtIndexPath中創(chuàng)建cell港柜,填充數(shù)據(jù)劳跃,刷新狀態(tài)等操作,相比于之前也提前了;
3.用戶繼續(xù)滑動的話,當cell馬上就需要顯示的時候我們再調(diào)用willDisplayCell方法,原則就是:何時需要顯示,何時再去調(diào)用willDisplayCell方法;
4.當cell完全離開屏幕以后,會調(diào)用didEndDisplayingCell方法,跟之前一樣,cell會進入重用隊列.
在iOS 10 之前,cell只能從重用隊列里面取出,再走一遍生命周期,并調(diào)用cellForItemAtIndexPath創(chuàng)建或者生成一個cell.
在iOS 10 中,系統(tǒng)會cell保存一段時間,也就是說當用戶把cell滑出屏幕以后,如果又滑動回來,cell不用再走一遍生命周期了,只需要調(diào)用willDisplayCell方法就可以重新出現(xiàn)在屏幕中了.
iOS 10 中,系統(tǒng)是一個一個加載cell的,二以前是一行一行加載的,這樣就可以提升很多性能;