NSOperation
の使用と描画に関するアドバイスを求めています。
メインスレッドにサブクラスを作成させ、NSOperation
サブクラスに追加しますNSOperationQueue
。
私NSOperation
はいくつかの重い処理を行います.main()メソッドで数分間ループし、常にいくつかの作業を処理することを目的としていますが、今のところ、内部にsleep(1)を含むwhile()ループがあり、移動するように設定されています.約5回(テスト用)。
これを生成するメイン (元の) スレッドNSOperation
は、ビューへの描画と UI の更新を担当します。
NSOperation スレッドに通知を使用して、メイン スレッドにある程度の処理が完了したことを伝えるつもりでしたが、現時点では、この通知は while() ループを通過するたびに 1 回 (つまり、1 秒に 1 回) 送信されます。 sleep(1) を実行しているだけです)。メイン スレッド (ビュー) は、これらの通知を受け取るように登録します。
通知はすぐにメイン スレッドに到達し、非同期のように見えますが、問題ないように見えます。両方のスレッドが期待どおりに実行されているようです...つまり、同時に実行されます。(各スレッドがいつ通知を送受信するかを大まかに確認するために NSLog() を使用します)。
ビューが通知を受け取り、そのハンドラー メソッドが呼び出されると、単純に整数変数をインクリメントし、これを (もちろん文字列として) ビューに描画しようとします。テストでは、drawRect: のコードは、この整数を (文字列として) 画面にうまく描画します。
ただし、ここに私の問題があります (申し訳ありませんが、ここに到達するまでに少し時間がかかりました): メインスレッド (ビュー) が NSOperation から通知を受け取ると、このテスト整数を更新し、[self setNeedsDisplay] を呼び出します。ただし、ビューは NSOperation が終了するまで再描画されません! 別のスレッドである NSOperation には、メイン スレッドのイベント ループをブロックする機能がないことを期待していましたが、これが起こっているようです。NSOperation が終了し、その main() が戻ると、ビューは最終的にすぐに再描画されます。
おそらく私はNSOperation
正しく使用していません。「非並行」モードで使用していますが、名前にもかかわらず、これでも新しいスレッドが生成され、非同期処理が可能になると理解しています。
コードを見たい場合は、私に知らせてください。