2

並行性の NS/Objective-C モデルについて理解を深めています。次のようなコマンド ライン ツールがあるとします。

#include "myLibrary.h"

void callback(void* parameter){
  cout<<"callback called.\n";
  //some logic...
}

int main(int argc, char* argv[]){
  myLibraryInit(callback);
  std::string s;
  while(true){
    cin>>s;
    myLibrarysResponseTo(s);
  }
}

私のライブラリでは、2 つの応答ができるようにしたいと考えています。繰り返しタイマーを開始するものと停止するもの。タイマーは、myLibraryInit によってライブラリに提供されるコールバックを呼び出す必要があります。

以前に iPhone/iPad アプリで NSTimers を使用したことがありますが、問題はコマンド ライン ツールのパラダイムが異なることに起因すると思います。メインスレッドはメインに入り、プログラムが終了するまで終了しません。これは、タイマーを動かすメインの実行ループを自由に実行できないことを意味します。おもう。では、このコンテキストで NSTimer を機能させるにはどうすればよいでしょうか?

もう 1 つのことは、Apple NSTimer のドキュメントには、インストールされたのと同じスレッドでNSTimer を無効にする必要があると書かれていることです。タイマーをインストールしたときにどのスレッドにいたかを把握し、タイマーを無効にするまで追跡する方法がわかりません。スレッドとディスパッチ キュー、実行ループ、またはその他の間の明らかなマッピングが欠落しているだけなのかどうかはわかりません。私はコア Bluetooth を使用しており、中央マネージャーを次のように初期化します。

_centralManager=[[CBCentralManager alloc]
  initWithDelegate: self
  queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
];

ここからコールバックがトリガーされる可能性があります。タイマーを停止するライブラリ関数を呼び出すためのロジックがコールバックに含まれている場合、どのスレッドが無効になったかを保証できません。では、タイマーを適切に無効にするにはどうすればよいでしょうか。

この質問を見つけましたが、タイマーがオンになっている実行ループと同時にメインが発生することはできません。

十分なコンテキストを提供したことを願っています。返信ありがとうございます。

4

1 に答える 1

7

[GCD または非同期操作を使用する] システム フレームワークのいずれかが正しく動作するには、メイン スレッドで を呼び出すdispatch_main()か実行する必要があります。NSRunLoop

[[NSRunLoop currentRunLoop] run];これは、関数の最後で呼び出すのと同じくらい簡単main()です (そのメソッドが返されないため、最初にキックオフ作業をスケジュールするようにしてください)。

于 2014-01-10T22:57:46.520 に答える