有些事情 NSOperationQueue 文档作者忘记提及,使得这样的实现看起来微不足道,而实际上并非如此。
仅当从同一线程将 NSOperations 添加到队列中时,才能保证将最大并发操作计数设置为 1 是串行的。
我正在使用另一个选项,因为它可以正常工作。
从不同的线程添加 NSOperations 但使用 NSCondition 来管理队列。startOperations 可以(并且应该,你不想用锁阻塞主线程)用 performSelectorOnBackgroundThread 调用......
startOperations 方法表示由一个或多个 NSOperations 组成的单个作业。
- (void)startOperations
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[AppDelegate condition] lock];
while (![[[AppDelegate queue] operations] count] <= 0)
{
[[AppDelegate condition] wait];
}
NSOperation *newOperation = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
NSOperation *newOperation1 = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation1];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
NSOperation *newOperation2 = [alloc, init]....;
[[AppDelegate queue] addOperation:newOperation2];
[[AppDelegate queue] waitUntilAllOperationsAreFinished]; // Don't forget this!
// Add whatever number operations you need for this single job
[[AppDelegate queue] signal];
[[AppDelegate queue] unlock];
[NotifyDelegate orWhatever]
[pool drain];
}
而已!