2013-10-19 34 views
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 
    }]; 
}]; 

有没有更好的方法?

+0

多数民众赞成我如何写它,也会好奇,知道是否有更好的方法。 –

+1

您要查找多少并发数。您的代码将在后台运行,但不会同时运行多个文件操作。你也不应该在后台线程上使用'defaultManager'。 – Wain

+0

@Wain你能否阐述为什么(在答案中,也许)?我有兴趣使用尽可能多的内核来并行处理文件。 – hpique

回答

1

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

你想要做的东西有点不同有你的处理任务同时运行。您应该在主线程上进行迭代,并在循环的每次迭代中将全局队列添加到全局队列中。

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

1

这里是你可以考虑的方法。如果你有(或可能有)成千上万的文件,而不是枚举enumerateObjectsWithOptions:usingBlock:,你可能想要批量手动枚举数组(比方说每个100个元素)。当前批次完成执行时(您可以使用分派组检查)开始下一批次。通过这种方法,您可以避免将数以万计的块添加到队列中。

BTW我已经删除了我以前的答案,因为它是错误的。