并发文件枚举

时间:2013-10-19 17:31:09

标签: ios objective-c macos concurrency nsfilemanager

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

平台是否提供了这样做的方法?由于缺乏更好的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
    }];
}];

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

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

您希望执行一些不同的操作以使您的处理任务同时运行。你应该在主线程上进行迭代,并在循环的每次迭代中向全局队列添加一个块。

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

答案 1 :(得分:1)

这是您可以考虑的方法。如果你有(或可能有)成千上万的文件,而不是枚举enumerateObjectsWithOptions:usingBlock:,你可能想要批量手动枚举数组(让我们说每个100个元素)。当前批处理完成执行时(您可以使用调度组进行检查),您将开始下一批处理。使用这种方法,您可以避免向队列中添加数万个块。

BTW我删除了之前的答案,因为它错了。