0

NSOperationmainQueueに関連するプロセスがUITableViewのスクロールにどのように影響しないのだろうか。NSOperationメインキューを使用すると、UITableViewのスクロールがスムーズになりますか?

私のコードでスクロールスクロールの主な理由は、各セルがサーバーからイメージを取得する必要があるため、各セルの読み込みが遅いことです。 それで、私はGCDを使って別のスレッドを作成して、各セルによって与えられたフェッチプロセスを処理していました。一方、メインスレッドは排他的にtableviewのスクロールを処理しますが、これは高速スクロールを確実にするために理解したものです。

最近、私はサンプルコードがNSOperationを使用していることに気付きました。 テーブルビューのセルがNSOperationmainQueueを使ってロードされるように、私はその部分を模倣しました。 私は理解しているように、メインスレッドがセルの読み込みとテーブルビューの両方のスクロールを処理するので、tableviewのスクロールパフォーマンスに課税すると予想しました。

しかし、驚くべきことに、それはありません。セル読み込みとテーブルビューの両方のスクロールのパフォーマンスは完璧です。 私はまだこれがどのようにできるのだろうかと思います。

私は間違っていると思います。 あなたはそれが何であるか教えていただけますか?

+1

サンプルコードへのリンクを提供します。 – trojanfoe

+1

関連するコードで質問を更新してください。 – rmaddy

+0

ニージャーク:GCD!=スレッド;ブロッキングイメージフェッチを使用しないでください。スレッドを妨害するブロッキングイメージフェッチは、ランループに接続された非ブロッキングイメージフェッチより効率が悪いです。 – Tommy

答えて

0

iOSアプリケーションのメインスレッドは、2つの要素で構成されています

メインキュー

メインディスパッチキュー•実行ループ

• は、タスクを実行することを世界的に利用できるシリアルキューですアプリケーションのメインスレッド上にあります。 (1つが存在する場合)このキューは、実行ループに接続されている他のイベントソース の実行とキューに入れられたタスクの 実行をインタリーブに アプリケーションの実行ループで動作します。アプリケーションのメインの スレッドで実行されるため、メインキューはアプリケーションのキー同期ポイント としてよく使用されます。

Source

あなたのビューコントローラを持っているコードが実行ループ(これについてはよく分からない)上で実行されます。だからこそ、あなたは長続きする作業を実行することができません。

これらのタスクをメインキューに委譲することができます(これはあなたがやっていることです)。これを実行すると、OS は、実行ループとメインキューの間で実行をインターリーブして(画像をロードする)となります。そのため、ビューをスクロールすることはまだかなりスムーズです。

メインキューですべての非同期タスクを実行するのはなぜですか?をお尋ねすることがあります。メインキューはスレッドプロセッサ時間を実行ループと共有する必要があるため、バックグラウンドスレッドよりも処理が遅くなります。あなたがその例で見ることができるものではありません。

0

すべてのiOS UIアニメーション(スクロールを含む)は、別々のUIスレッドで実行されます。つまり、UITableViewに必要なデータがすべて(つまり、イメージがロードされるまで空のセルを提供する)限り、メインスレッドのどのような種類のアクティビティでもブロックされません。

は、現在のスレッドまたはアプリケーションのメインスレッドをブロックしないように、セカンダリスレッドで実行されます。

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

関連する問題