メソッドから戻らずにコアプロットを更新するにはどうすればよいですか?
-
22-07-2019 - |
質問
コアプロットを使用するココアインターフェイスがあります。インターフェイスでボタンを押すと、プロットが描画されます。間にメソッドsleep()を呼び出して、プロットメソッドを複数回呼び出して、一連のグラフを作成したかったのです。しかし、データをリロードするための呼び出しが行われたとしても、関数が終了するまで何も起こらないようです(最後のグラフも表示するだけです)。これでCPAnimationが存在することがわかりましたが、使用を開始する前に、関数が終了してグラフが更新されるとどうなるのかと思っていました。スリープを使用する代わりに、リフレッシュを処理するスレッドに譲らなければならないでしょうか?
解決
わかりました。 reloadDataメソッドを別のスレッドのメソッドから呼び出しました(常に返されます)。これは、IBActionおよびNSTimerからreloadDataを呼び出すことに要約されました。最後に、スリープを使用する代わりに、NSConditionLockを使用して処理と更新を調整します
他のヒント
おそらく、Core Plot(またはコード)は、表示が必要なビューを設定します。それはすぐには起こりません。イベントループに戻ると発生します。
Mac OS Xアプリケーションで sleep
を使用するたびに、子犬を殺します。代わりにNSTimerを使用してください。タイマーコールバックメソッドに1つのグラフに必要な作業を行わせ、メソッドがどのグラフを描画するかを知るために必要なインスタンス変数を設定して、メソッドが各グラフを使い果たすまで順番に描画するようにします。
または、ユーザーにすべてのグラフをスライドショーとして表示させる代わりに、ユーザーが選択できるグラフのリストを提示することをお勧めします。 (明示的にラベル付けされたスライドショーが実装されている場合を除きます。)
Core Plotは、ほとんどのCocoa描画フレームワークと同様に、怠zyです。実行ループの反復の最後に描画します。これは、物が頻繁に描かれないようにするためです。
すぐに描画するのではなく、レイヤーは描画が必要としてマークされます。
他の人が指摘したように、スリープへのより良いアプローチは、NSTimerを使用して実行ループのブロックを回避するか、performSelector:withObject:afterDelay:
などのNSObjectメソッドを使用することです Peterが正しいこと—データの再読み込みメソッドは実際には何も描画しません。プロットは表示が必要であるとしてマークされ、レイヤーが次に画面に描画されるときに更新されます。 sleep
を使用する場合、描画する機会はありません。
また、Core Plotはかなり若いプロジェクトです。 CPAnimation
および関連するクラスはスタブです。彼らはまだ何もしていません。 :-)