NSOperation的执行线程取决于NSOperationQueue
添加操作的位置。在您的代码中查找此语句-
[[NSOperationQueue mainQueue] addOperation:yourOperation];
所有这一切都假定您没有做任何进一步的穿线main
方法,NSOperation
即您编写(预期)编写工作指令的实际方法是真正的怪物。
但是,在并发操作的情况下,情况有所不同。队列可以为每个并发操作生成一个线程。虽然它不是guarrantteed,它依赖于系统资源VS操作的资源需求,在这一点上在系统中。您可以通过其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;
然后,我继续创建NSOperation并使用addOperation将其添加。在此操作的主要方法中,当我检查当前线程时,
NSLog(@"Operation obj = %@\n current thread = %@ \n main thread = %@", self, [NSThread currentThread], [NSThread mainThread]);
它不是主线程。并且,发现当前线程对象不是主线程对象。
因此,在主线程上自定义创建队列(其操作之间没有并发性)并不一定意味着这些操作将在主线程本身上串行执行。