1

我必须对大量文件执行复杂的操作。幸运的是,枚举顺序并不重要,这些作业可以在没有锁定的情况下并行完成。

该平台是否提供了一种方法来做到这一点?由于缺乏更好的 API,我在想:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSArray *paths = [[NSFileManager defaultManager] subpathsAtPath:folder];
    [paths enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(NSString *path, NSUInteger idx, BOOL *stop) {
        // Complex operation
    }];
}];

有没有更好的办法?

4

2 回答 2

1

您当前的代码将一个块放在全局队列中。因此,该单个块将在后台线程上运行并执行所有迭代和处理。

你想做一些不同的事情来让你的处理任务同时运行。您真的应该在主线程上进行迭代,并在循环的每次迭代中向全局队列添加一个块。

更好的是,创建一个NSOperation子类。把你的逻辑放在那里。在循环中创建操作的实例并将它们添加到操作队列中。这是一个更高级别的 API,并为您提供添加依赖项、定制最大并发性、检查仍待完成的操作数量等方面的选项......

于 2013-10-19T17:58:53.150 回答
1

这是您可以考虑的一种方法。如果您有(或可能有)数万个文件,而不是枚举,enumerateObjectsWithOptions:usingBlock:您可能希望批量手动枚举数组(假设每个 100 个元素)。当当前批次完成执行时(您可以使用调度组来检查),您开始下一个批次。使用这种方法,您可以避免将数万块添加到队列中。

顺便说一句,我已经删除了我之前的答案,因为它是错误的。

于 2013-10-19T18:17:10.103 回答