0

マイクから入力を受け取り、いくつかの計算を実行してから画面にレンダリングするアーキテクチャがあります。

問題はsetNeedsDisplay、メイン スレッドが計算を実行しているため、呼び出しによって drawRect への呼び出しがトリガーされないことです。

これをスレッド化する最良の方法は何でしょうか?

単一のシリアル キューを作成し、GCD を使用してこのバックグラウンド キューに作業をディスパッチし、最終的な setNeedsDisplay をメイン キューにディスパッチします。または、これを行うより効率的な方法はありますか?

4

3 に答える 3

0

すべてをメインスレッドから長時間実行し続けます。それが私の意見では最高です。長時間の計算も何かです

UIThread をブロックしないようにしてください

于 2013-05-01T09:07:50.227 に答える
0

... GCD を使用してこのバックグラウンド キューに取り組み、最終的な setNeedsDisplay をメイン キューにディスパッチします。または、これを行うより効率的な方法はありますか?

あなたのかなり漠然とした説明に基づいて、あなたが提案したものが最良のアプローチだと思います。

GCD でこれを行うと、実行する作業のブロックがコード内でインライン化され、何が起こっているのかを理解しやすくなるため、コードが読みやすくなります。

于 2013-05-02T10:56:18.923 に答える
0

単一のシリアル キューを作成し、GCD を使用してこのバックグラウンド キューに作業をディスパッチし、最終的な setNeedsDisplay をメイン キューにディスパッチします。または、これを行うより効率的な方法はありますか?

利用可能な最高レベルの API を使用する必要があります。この場合、それは NSOperation またはそのサブクラスの 1 つです。おそらく、NSBlockOperationが必要なものです。あなたがすべき

完了ハンドラは、メイン スレッドで setNeedsDisplay を呼び出す必要があります。これを行うには、performSelectorOnMainThread:withObject:waitUntilDone:をビューに送信します。

[myViewThatNeedsUpdating performSelectorOnMainThread: @selector(setNeedsDisplay) 
                                          withObject: nil 
                                       waitUntilDone: NO];

これは、GCD を直接使用するよりも優れたアプローチだと思います。これは、Objective-C のイディオムに近いため、実行中の作業を最後に通知から分離し、生の GCD よりも多くの処理方法のオプションを提供します。たとえば、これらの処理のいくつかを順番に実行したい場合は、多くのコードを書かなくても、いくつかの操作を他の操作に依存させることができます。

于 2013-05-02T12:40:10.343 に答える