3

UI 要素にNSStatusItemと メニューが含まれるアプリケーションがあります。私の application 内では、NSTask非同期に を使用して何らかの操作を実行し、 を使用して取得した出力を使用し NSFileHandleReadCompletionNotificationてメニューを更新しています。しかし、メニューをクリックして開くたびに、メインの実行ループに入り NSEventTrackingRunLoopMode、通知の投稿が失敗します。したがって、基本的にメニューが開いていると、メインスレッドで操作は行われません。この投稿で同様の問題を見つけましたが、そこで受け入れられた解決策は役に立たないようです。NSNotificationCenterについて、 をブロックしてはNSRunloopDefaultModeならないことを理解しています。この動作を変更する方法はありますか??? 誰でも助けてもらえますか???

4

1 に答える 1

3

私が推測しているのは、あなたがをNSFileHandle表すを持っていて、それを要求したということです。NSTaskstdout-readInBackgroundAndNotify

あなたが見つけたように、これに関する問題は、ランループがデフォルトモードの場合にのみ通知することです。実行ループが別のモードに入ると (メニューが開いている場合など)、通知はメインの実行ループでキューに入れられ、実行ループが再びデフォルト モードに入るまで待機します。

代わりに使用したいのは、と の両方を-readInBackgroundAndNotifyForModes:含む配列を渡すメソッドです。これは、実行ループがデフォルト モードまたはイベント トラッキング モードのいずれかにある場合に、使用可能なデータについて通知する必要があることを実行ループに示します。NSDefaultRunLoopModeNSEventTrackingRunLoopMode

于 2012-06-04T14:48:26.333 に答える