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