Самый быстрый способ получить содержимое папки на Mac, в obj-c

Ну, заголовок довольно явный, но немного пояснений для тех, кто интересуется фоном. Я разрабатываю маленький браузер изображений. На части приложения находится браузер каталогов, который позволяет мне просматривать все папки моего жесткого диска и подключенных томов. И во время профилирования я заметил, что самым трудоемким методом моего приложения был следующий фрагмент кода:

// 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 ответ

Независимо от того, как вы пишете эту функцию (например, с любой какао NSFileManager API или Unix opendir(3) /readdir(3) API), это будет связано с вводом / выводом - вы будете тратить больше времени на ожидание ввода / вывода, чем на любые операции ЦП, выполняемые на средних уровнях.

Если это действительно ваше узкое место, то это означает, что вы делаете слишком много операций ввода-вывода. Убедитесь, что вы не делаете ничего глупого, например, постоянно читаете содержимое одного и того же каталога снова и снова сотни раз в секунду. Если вам нужно постоянно наблюдать за конкретным каталогом и предпринимать действия при изменении чего-либо в этом каталоге (например, при записи файла, создании или удалении файла и т. Д.), Используйте API-интерфейс событий файловых систем. Это позволяет эффективно реагировать на эти события, когда они происходят, без необходимости постоянного опроса каталога.

Другие вопросы по тегам