你是对的,你肯定会受到 I/O 的限制。并且同时打开多个文件并被主动读取的随机访问性质会加剧这种情况。
因此,您需要取得一些平衡。正如您所观察到的,一个文件很可能不是最有效的。
亲自?
我会使用调度信号量。
就像是:
@property(nonatomic, assign) dispatch_queue_t dataQueue;
@property(nonatomic, assign) dispatch_semaphore_t execSemaphore;
和:
- (void) process:(NSData *)d {
dispatch_async(self.dataQueue, ^{
if (!dispatch_semaphore_wait(self.execSemaphore, DISPATCH_TIME_FOREVER)) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
... do calcualtion work here on d ...
dispatch_async(dispatch_get_main_queue(), ^{
.... update main thread w/new data here ....
});
dispatch_semaphore_signal(self.execSemaphore);
});
}
});
}
开始的地方:
self.dataQueue = dispatch_queue_create("com.yourcompany.dataqueue", NULL);
self.execSemaphore = dispatch_semaphore_create(3);
[self process: ...];
[self process: ...];
[self process: ...];
[self process: ...];
[self process: ...];
.... etc ....
您需要确定如何最好地处理排队。如果有很多项目并且有取消的概念,那么将所有内容都排入队列可能是一种浪费。同样,您可能希望将要处理的文件的 URL 排入队列,而不是像上面这样的 NSData 对象。
无论如何,上面将同时处理三件事,不管有多少已经入队。