在obj-c中以最快的方式在Mac上检索文件夹的内容

时间:2011-08-26 01:03:00

标签: objective-c cocoa

嗯,标题很明确,但对那些对背景感兴趣的人有一点解释。 我正在开发一个小图像浏览器。在应用程序的一部分是一个目录浏览器,它允许我浏览我的硬盘驱动器和已安装的卷的所有文件夹。 在进行性能分析时,我注意到我的应用程序最耗时的方法是以下代码:

// get the content of the directory
NSFileManager * fileManager = [NSFileManager defaultManager];
NSURL * url = [NSURL fileURLWithPath:mPath];
mCachedContent = [[fileManager contentsOfDirectoryAtURL:url
                               includingPropertiesForKeys:nil
                               options:NSDirectoryEnumerationSkipsHiddenFiles
                               error:nil] retain];

// parse the content, count the number of images and directories.
for (NSURL * item in mCachedContent)
{
    if (CFURLHasDirectoryPath((CFURLRef)item))
    {
        ++mNumChildren;
    }
    else if ([FileUtils isImage:[item path]] == YES)
    {
        ++mNumImages;
    }
}

这是必要的,以便NSOutlineView可以知道目录是否可扩展(并且图像的数量也是我需要的功能) 更确切地说,如果[NSFileManager contentsOfDirectoryAtURL ...]

,最耗时的方法

那么,有没有其他方法可以让目录的内容比我使用的内容更有效?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

无论你如何编写这个函数(例如使用Cocoa的NSFileManager API或Unix opendir(3)/readdir(3) API),它都会受到I / O限制 - 你会花更多的时间等待I / O而不是中间层执行的任何CPU操作。

如果这确实是你的瓶颈,那么这意味着你做了太多的I / O.确保你没有做任何愚蠢的事情,比如不断地每秒反复读取同一目录的内容数百次。如果您需要不断观察特定目录并在该目录中的某些内容发生更改(例如,文件被写入,创建或删除文件等)时采取措施,则使用File Systems Events API。这使您可以在事件发生时有效地响应这些事件,而无需不断轮询目录。