天天看點

如何解決iOS瀑布流(UIScrollView或UITableView)運作不流暢

寫的一個程式中用到了瀑布流的展現方式,但是發現當圖檔數量太大的時候,在iPhone4上會不流暢,這點很不爽。

寫代碼之初是做了一些優化的,比如cell重用,異步加載,但是還是很卡。

終于後來發現了症結所在,那就是,如果滑動太快,可能同時就發出了比如10個圖檔請求。這些請求雖然都在背景運作,但是它們可能在同一個時間點傳回UI線程。這個時候如果加載圖檔到UIImageView太頻繁,就會造成UI卡得嚴重。(雖然在new iPad和iPhone4s上看不出來)

在找到這個問題的同時,也發現performSelectorAfterDelay這個方法,會堆積到UI線程空閑的時候執行。而dispatch_after或者dispatch_async都會直接插入UI線程當場執行。是以這個問題其實可以用performSelectorAfterDelay來解決,測試也是非常流暢,感覺不出一點點的卡。但會出現新的問題,那就是在滑動過程中,不會加載任何圖檔。知道scrollView停止的時候,圖檔才會出來。當然這不是理想的解決方法了。這個方法也沒有解決異步過程集中到達UI線程的問題。然後采用了NSOperationQueue來解決這個問題。

問題本身和UITableView加載不流暢是一樣的。

解決辦法

  1. 主要要做到一下幾個方面:
  2. 除了UI部分,所有的加載操作都在背景完成。

    這一點可以通過dispatch或者performSelectorInBackground或者NSOperationQueue來實作。見:

    在iOS開發中利用GCD進行多線程程式設計

    iOS開發中使用NSOperationQueue進行多線程操作

  3. 避免背景加載完成多個資源之後集中到達占用UI線程的處理時間太長。

    這一點可以通過NSOperationQueue來實作,将資源到UI的展現過程放在隊列中逐個執行,且在每個操作完成之後進行強制等待,可以用usleep(int microSeconds)來解決。

  4. 重用cell。

    建立cell一般是很慢的,一定要重用,甚至為了performance,可以在view建立之初就建立足夠多的cell在重用隊列中。

轉自:http://blog.unieagle.net/2012/08/31/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3ios%E7%80%91%E5%B8%83%E6%B5%81uiscrollview%E6%88%96uitableview%E8%BF%90%E8%A1%8C%E4%B8%8D%E6%B5%81%E7%95%85/