? ? ?寫的一個(gè)程序中用到了瀑布流的展現(xiàn)方式彼乌,但是發(fā)現(xiàn)當(dāng)圖片數(shù)量太大的時(shí)候,在iPhone4S上會(huì)不流暢剂府,這點(diǎn)很不爽拧揽。
? ? ?寫代碼之初是做了一些優(yōu)化的,比如cell重用腺占,異步加載淤袜,但是還是很卡。
? ? ?終于后來發(fā)現(xiàn)了問題所在衰伯,如果滑動(dòng)太快铡羡,可能同時(shí)就發(fā)出了比如10個(gè)圖片請(qǐng)求。這些請(qǐng)求雖然都在后臺(tái)運(yùn)行意鲸,但是它們很有可能在同一個(gè)時(shí)間點(diǎn)返回UI線程烦周。這個(gè)時(shí)候如果加載圖片到UIImageView太頻繁,就會(huì)造成UI卡頓嚴(yán)重怎顾。(雖然在最新的iPad和iPhone6上看不出來)
? ? ?在找到這個(gè)問題的同時(shí)读慎,也發(fā)現(xiàn)performSelectorAfterDelay這個(gè)方法,會(huì)堆積到UI線程空閑的時(shí)候執(zhí)行槐雾。而dispatch_after或者dispatch_async都會(huì)直接插入U(xiǎn)I線程當(dāng)場(chǎng)執(zhí)行夭委。所以這個(gè)問題其實(shí)可以用performSelectorAfterDelay來解決,測(cè)試也是非常流暢募强,感覺不出一點(diǎn)卡頓株灸。但會(huì)出現(xiàn)新的問題崇摄,那就是在滑動(dòng)過程中,不會(huì)加載任何圖片蚂且。直到scrollView停止的時(shí)候配猫,圖片才會(huì)出來。當(dāng)然這不是理想的解決方法了杏死。這個(gè)方法也沒有解決異步過程集中到達(dá)UI線程的問題。然后采用了NSOperationQueue來解決這個(gè)問題捆交。
問題本身和UITableView加載不流暢是一樣的淑翼。
解決辦法:
主要要做到一下幾個(gè)方面:
(1)除了UI部分,所有的加載操作都在后臺(tái)完成品追。
(2)這一點(diǎn)可以通過dispatch或者performSelectorInBackground或者NSOperationQueue來實(shí)現(xiàn)玄括。
詳細(xì)見:
在iOS開發(fā)中利用GCD進(jìn)行多線程編程
iOS開發(fā)中使用NSOperationQueue進(jìn)行多線程操作
避免后臺(tái)加載完成多個(gè)資源之后集中到達(dá)占用UI線程的處理時(shí)間太長(zhǎng)。
這一點(diǎn)可以通過NSOperationQueue來實(shí)現(xiàn)肉瓦,將資源到UI的展現(xiàn)過程放在隊(duì)列中逐個(gè)執(zhí)行遭京,且在每個(gè)操作完成之后進(jìn)行強(qiáng)制等待,可以用usleep(int microSeconds)來解決泞莉。
重用cell哪雕,創(chuàng)建cell一般是很慢的,一定要重用鲫趁,甚至為了performance斯嚎,可以在view創(chuàng)建之初就創(chuàng)建足夠多的cell在重用隊(duì)列中。
? ? ?此文章只是本人的小小經(jīng)驗(yàn)挨厚,望高手指點(diǎn)堡僻。