1

私の Cocoa アプリには、イベントの結果として一連の作業を行うために、データの階層を介して呼び出す処理が時々あります。各小さなピースは、いくつかのリソースを作成および破壊します。ほとんどの場合、これらのリソースは必要ありませんが、すべての作業の前にそれらを作成し、最後にそれらを削除するスマートな方法を見つけたいと考えています.

これらのバッファなどを「親」または他の場所からグローバルに使用できるようにする以外に、イベント ループの実行が終了したときに一部のコードでローカルに知る方法はありますか? 次に、それらが存在しない場合はそれらを作成し、実行ループが終了するまでそれらを保持して、それ以前の後続の呼び出しでそれらを再利用できます。

編集:コードを再構築する方法についての提案を探しているわけではありません。この問題は、ランループがいつ完了したかを知る方法についての質問を引き起こしました。私が書き込みをしているとしたら、Javascript はわかりませんが、setTimeoutwith zero を使用して終了イベントのクリーンアップを実行します。間隔がゼロの NSTimer もこれを達成できると思いますが、よりクリーンなものがあるかどうか疑問に思っています。

ありがとう。

4

2 に答える 2

2

「Cocoa」と「NSRunLoop」と言ったので、Mac OS X を使用していると仮定します。Snow Leopard を使用している限り、Grand Central Dispatch を使用してこの種の問題を非常にエレガントに解決できます。

Leopard 以降 (さらに言えば iPhone) の場合は、NSOperations を使用して同じことを行うことができます (少しコードを増やします)。

このすべてについては、Concurrency Programming Guideで説明されています。

アルゴリズムがメイン スレッドから (メイン イベント ループの外で) 実行されるように設計されていない場合でも、メイン キューを介して、「後で」シリアルに実行されるようにスケジュールを設定するという問題を解決できます。

于 2010-06-12T23:37:17.063 に答える
0

私はCocoaでのプログラミングに比較的慣れていませんが、これは、クラスレベルの変数とその変数へのゲッターによって簡単に実現できるのではないでしょうか。

擬似コードで、コードが次のようになっているとしましょう。

bool completed = false;

void chi
  if completed = false
    create foo;
    create bar;

   completed = true 
  end if

  while looping
     ...
  loop

  completed = false;
  destroy foo
  destroy bar

また、プログラムの他の部分で、「completed」の値をチェックして、上記のオブジェクトが作成されたかどうかを確認しますか?

編集:私はあなたの質問を読み直し、それに応じて編集しました。これがマルチスレッドアプリの場合は、オブジェクトがスレッドセーフであることも確認する必要があります。

于 2010-06-12T22:37:00.337 に答える