NSOperation の実行スレッドはNSOperationQueue
、操作を追加した場所によって異なります。あなたのコードでこのステートメントを見てください -
[[NSOperationQueue mainQueue] addOperation:yourOperation]; // or any other similar add method of NSOperationQueue class
これはすべて、作業命令が書かれている (期待される) 実際のモンスターであるmain
方法で、それ以上のスレッド化を行っていないことを前提としています。NSOperation
ただし、同時操作の場合、シナリオは異なります。キューは、同時操作ごとにスレッドを生成する場合があります。これは保証されていませんが、システムのその時点でのシステム リソースと操作リソースの需要によって異なります。プロパティによって操作キューの同時実行性を制御できmaxConcurrentOperationCount
ます。
編集-
私はあなたの質問が興味深いと思ったので、自分で分析/ロギングを行いました。このようにメインスレッドで作成された NSOperationQueue があります-
self.queueSendMessageOperation = [[[NSOperationQueue alloc] init] autorelease];
NSLog(@"Operation queue creation. current thread = %@ \n main thread = %@", [NSThread currentThread], [NSThread mainThread]);
self.queueSendMessageOperation.maxConcurrentOperationCount = 1; // restrict concurrency
次に、NSOperation を作成し、addOperation を使用して追加しました。現在のスレッドを確認したときのこの操作のメインメソッドでは、
NSLog(@"Operation obj = %@\n current thread = %@ \n main thread = %@", self, [NSThread currentThread], [NSThread mainThread]);
それはメインスレッドではありませんでした。そして、現在のスレッド オブジェクトがメイン スレッド オブジェクトではないことがわかりました。
そのため、メイン スレッドでのカスタム キューの作成 (操作間に同時実行性がない) は、操作がメイン スレッド自体でシリアルに実行されることを必ずしも意味しません。