iOS - 在某些文件夹中进行迭代

时间:2017-06-05 06:39:23

标签: ios objective-c file

我需要在明确的文件夹中获取一些文件。为此,我使用这个answer,它工作正常。但是,我的文件夹结构如下:

Documents/
  idOfFolder1/
    images/
      image1.jpg
      image2.png
    sounds/
      sound1.mp3
    files/
      file1.pdf
  idOfFolder2/
    images/
      ...

我需要遍历具有特定ID的所有文件夹并获取图像。由于所写的答案遍历所有文件夹,因此需要的时间比正常情况多得多(我们有很多文件)。为了优化过程,我想跳过“声音”和“文件”文件夹。有办法解决这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您不想使用NSPredicate,以下代码也会按照您的意愿行事,

(此代码将直接访问具有给定ID的文件夹并选择 images 文件夹中的所有内容)

-(void) printImagesOfFolders:(NSArray *) folderIds{

    for(NSString *folderId in folderIds){

        NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
        NSURL *documentsURL = [paths lastObject];
        NSString * imageFolderPath = [NSString stringWithFormat:@"%@/images", folderId];

        NSURL *rootURL = [documentsURL URLByAppendingPathComponent:imageFolderPath];
        NSFileManager *fm = [NSFileManager defaultManager];
        NSDirectoryEnumerator *dirEnumerator = [fm enumeratorAtURL:rootURL
                                        includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
                                                           options:NSDirectoryEnumerationSkipsHiddenFiles
                                                      errorHandler:nil];

        for (NSURL *url in dirEnumerator) {

            NSLog(@"url: %@", url);

        }

    }

}

如何使用

[self printImagesOfFolders:@[@"idOfFolder1",@"idOfFolder2",@"idOfFolder3",@"idOfFolder4"]];

答案 1 :(得分:0)

我认为您可以使用NSPredicate以不同的方式在NSDirectoryEnumerator数组中实现它,就像在这个答案Iterating through files in nested foldersFilter NSFileManager with NSPredicate中一样,但语法可能很尴尬:看看NSPredicate语法文档NSPredicate Format String

在你的情况下,我会: 1.使用带有for循环的快速枚举 2.如果可能,重新设计文件夹结构 3.使用核心数据或其他缓存系统加速加载过程(这涉及与实际文件不时同步)

答案 2 :(得分:0)

没错。楼上是正确的,索引将根据图片直接命名,以便CPU可以准确找到文件