0

我不知道如何與NSOperationmainQueue相關的過程不會影響UITableView的滾動。如何使用NSOperation mainqueue使UITableView的滾動順暢?

我的代碼中滾動緩慢的主要原因是每個單元格加載速度都很慢,因爲每個單元格都必須從服務器獲取圖像。 這就是爲什麼我用GCD創建另一個線程來處理每個單元給出的讀取過程。同時,主線程專門處理tableview的滾動,這是我所瞭解的確保快速滾動。

但是,在最近幾天,我注意到一個示例代碼是使用NSOperation。 我模仿了零件,使桌面單元格使用NSOperationmainQueue加載。 我預料它會減稅tableview的滾動性能,因爲主要線程處理單元格加載和tableview滾動,據我所知。

但是,令人驚訝的是,它沒有。單元格加載和tableview滾動的表現是完美的。 我仍然想知道這可以如何。

我想我要麼錯了,要麼想念什麼。 你能讓我知道它是什麼嗎?

+1

提供一個鏈接到示例代碼。 – trojanfoe

+1

用相關代碼更新你的問題。 – rmaddy

+0

膝蓋顛簸:GCD!=線程;不要使用阻止圖像抓取。阻塞線程的阻塞映像獲取比連接到runloop的阻塞映像效率低。 – Tommy

回答

0

iOS的應用程序的主線程由兩個部分組成:

•運行循環

•主隊列

主要調度隊列是一個全局串行隊列 執行任務在應用程序的主線程上。這個隊列 應用程序的運行循環的工作原理(如果存在的話),以用附着在運行循環其他事件源 執行交織的排隊任務的 執行。因爲它運行在應用程序的主線程 上,所以主隊列通常用作應用程序的關鍵同步點 。

Source

在你的視圖控制器你的代碼運行在運行循環(不知道這個)。這就是爲什麼你不能執行任何長期任務。

但你可以將這些任務委託給主隊列(這就是你正在做的)。當你這樣做時,OS 交錯運行循環和主隊列之間的執行(加載圖像)。這就是爲什麼滾動視圖仍然非常平滑。

爲什麼我們不在主隊列上執行所有的異步任務呢?你可能會問。由於主隊列必須與運行循環共享線程處理器時間,因此操作將比後臺線程執行得慢。不過,這並不是你可以在這個例子中觀察到的東西。

0

所有iOS UI動畫(包括滾動)都是在單獨的UI線程上執行的。因此,只要UITableView具有所有必需的數據(即您在圖像加載之前提供了空單元格),它將不會被任何主線程活動阻止。

動畫的執行發生在輔助線程上,以至 避免阻塞當前線程或您的應用程序的主線程。

https://developer.apple.com/.../AnimatingViews.html