Вы правы в том, что вы наверняка будете связаны с вводом / выводом.И это будет осложнено характером произвольного доступа, состоящего в том, что несколько файлов открыты и активно читаются одновременно.
Таким образом, вам необходимо немного соблюсти баланс.Скорее всего, один файл не самый эффективный, как вы заметили.
Лично?
Я бы использовал семафор рассылки.
Что-то вроде:
@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, как указано выше.
В любом случае, вышеприведенное будет обрабатывать три вещи одновременно, независимо от того, сколько было помещено в очередь.