キューとスレッドを混同しています。特に、NSOpertionQueueはGCDを使用するように書き直されているため、キューと特定のスレッドの間の接続はほとんどありません(メインスレッドの特殊なケースを除く)。
操作/ブロック/タスク(呼び出したいものは何でも)がキューに挿入され、「ワーカースレッド」がこれらをプルして実行します。メインキューを除いて、どの正確なスレッドが作業を実行するかをほとんど制御できません。 これは単純化されているため、正確には正しくありませんが、非常に高度で具体的なことをしているのでない限り、十分に真実です。
したがって、たとえば「バックグラウンドスレッドではなくメインキュー」で何かを実行することはできないため、4つのシナリオのいずれも意味がありません。
これで、メソッドstartAccelerationUpdates
はCMMotionManagerにハンドラーをメインキューに配置するように具体的に指示します。したがって、startAccelerationUpdates
が呼び出されると、実行中のスレッドで実行されますが、ハンドラーがメインスレッドで実行されるようにスケジュールされます。
少し複雑にするために、を呼び出してstartAccelerationUpdates
メソッドを呼び出していperformSelectorInBackground
ます。繰り返しますが、実際にどのスレッドが呼び出されるかはわかりませstartAccelerationUpdates
んが、メインスレッドにはなりません。
ただし、あなたの場合、そのスレッドが行っているのはstartAccelerationUpdates
、モーション更新を開始している呼び出しと、メインスレッドで(メインキューを介して)処理するように指示することだけです。
さて、ドキュメントから直接、メインキューを使用してモーションイベントを処理することを思いとどまらせるための何かがあります...
処理されたイベントが高率で到着する可能性があるため、メイン操作キューを使用することはお勧めしません。
残念ながら、あなたの声明
さらに興味深いのは、バックグラウンドスレッドで上記のメソッドを再度呼び出すと、今回は現在のキューを使用しても更新がないことです。
何を試したか、どのように試したか、なぜうまくいかなかったと思うかを判断するのに十分な情報を提供していません。だから、私は推測します...それは間違っているかもしれません。
の使用についてキーを押しますthe current Queue
。
で代用するという意味だと思い[NSOperationQueue mainQueue]
ます[NSOperationQueue currentQueue]
。
さて、それが何をするのか見てみましょう。メインキューを使用する代わりに、「他の」キューを使用します。どれ?さて、ドキュメントを見てみましょう:
currentQueue
現在の操作を開始した操作キューを返します。
+
(id)currentQueue
戻り値
操作を開始した操作キュー。キューを判別できなかった場合はnil。
討論
実行中の操作オブジェクト内からこのメソッドを使用して、それを開始した操作キューへの参照を取得できます。実行中の操作のコンテキスト外からこのメソッドを呼び出すと、通常、nilが返されます。
ディスカッションセクションに注意してください。から呼び出された操作を実行していないときにこれを呼び出すと、ハンドラーを配置するキューがないことを意味しますNSOperationQueue
。nil
だから、あなたは何も得られません。
NSOperationQueue
メインキュー以外を使用する場合は、使用するキューを指定する必要があります。したがって、それが目的のルートである場合は、モーションイベントを処理するための独自の操作キューを作成するだけで、オフになります。
幸運を!