Iphone 过滤一堆文件?

Iphone 过滤一堆文件?,iphone,ios,objective-c,cocoa-touch,nspredicate,Iphone,Ios,Objective C,Cocoa Touch,Nspredicate,给定文档目录中的以下文件-- 考虑到这些文件有一个NSArray的NSURLs,是否可以使用NSPredicate按路径或路径/子路径过滤数组?比如说 层次结构第一级中所有事物的唯一名称(动物、汽车、照片) 第二级所有事物的唯一名称(鸟、猫) 动物目录中的文件--(/Animals) Cats目录中的文件--(/animats/Cats) 既然这些是实际文档目录中的实际文件URL,为什么不使用NSFileManager目录属性的内容:?它直接回答了您提出的问题(“Cats目录中的文件”) 或者

给定文档目录中的以下文件--

考虑到这些文件有一个
NSArray
NSURLs
,是否可以使用
NSPredicate
按路径或路径/子路径过滤数组?比如说

  • 层次结构第一级中所有事物的唯一名称(动物、汽车、照片)
  • 第二级所有事物的唯一名称(鸟、猫)
  • 动物目录中的文件--(/Animals)
  • Cats目录中的文件--(/animats/Cats)

既然这些是实际文档目录中的实际文件URL,为什么不使用NSFileManager
目录属性的内容:
?它直接回答了您提出的问题(“Cats目录中的文件”)


或者,为了获得更多功能,请使用NSDirectoryEnumerator循环浏览文件。

因为这些是实际文档目录中的实际文件URL,为什么不使用NSFileManager
目录属性的内容:
?它直接回答了您提出的问题(“Cats目录中的文件”)


或者,为了获得更多的功能,请使用NSDirectoryEnumerator循环浏览文件。

如果您确实想过滤NSURL数组,可以执行以下操作:

- (NSArray *)filteredArray:(NSArray *)originalArray withSubpath:(NSString *)subpath {
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        NSURL *url = (NSURL *)evaluatedObject;
        NSRange range = [[url path] rangeOfString:subpath];
        return (range.location == 0);
    }];
    return [originalArray filteredArrayUsingPredicate:predicate];
}
下面是我如何测试它的:

NSArray *urls = @[[NSURL URLWithString:@"Animals/Birds/file1.xyz"],
                  [NSURL URLWithString:@"Animals/Birds/file2.xyz"],
                  [NSURL URLWithString:@"Animals/Cats/file1.xyz"],
                  [NSURL URLWithString:@"Cars/Ford/file1.xyz"]];

NSLog(@"Before: %@", urls);
urls = [self filteredArray:urls withSubpath:@"Animals/Birds"];
NSLog(@"After: %@", urls);
输出日志为:

Before: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz",
    "Animals/Cats/file1.xyz",
    "Cars/Ford/file1.xyz"
)
After: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz"
)

注意:它与子字符串匹配,因此在这种情况下由于前导斜杠(除非数组和子字符串都包含“/”)而与“/Animals”不匹配。

如果您确实想过滤NSURL数组,可以执行以下操作:

- (NSArray *)filteredArray:(NSArray *)originalArray withSubpath:(NSString *)subpath {
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        NSURL *url = (NSURL *)evaluatedObject;
        NSRange range = [[url path] rangeOfString:subpath];
        return (range.location == 0);
    }];
    return [originalArray filteredArrayUsingPredicate:predicate];
}
下面是我如何测试它的:

NSArray *urls = @[[NSURL URLWithString:@"Animals/Birds/file1.xyz"],
                  [NSURL URLWithString:@"Animals/Birds/file2.xyz"],
                  [NSURL URLWithString:@"Animals/Cats/file1.xyz"],
                  [NSURL URLWithString:@"Cars/Ford/file1.xyz"]];

NSLog(@"Before: %@", urls);
urls = [self filteredArray:urls withSubpath:@"Animals/Birds"];
NSLog(@"After: %@", urls);
输出日志为:

Before: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz",
    "Animals/Cats/file1.xyz",
    "Cars/Ford/file1.xyz"
)
After: (
    "Animals/Birds/file1.xyz",
    "Animals/Birds/file2.xyz"
)

注意:它匹配子字符串,因此在这种情况下,由于前导斜杠(除非数组和子字符串都包含“/”),它不会匹配“/Animals”。

主要是出于性能原因。该阵列是
UICollectionViewDataDource
的一部分,该阵列(通过挤压)在显示不同级别之间切换。我可以简单地迭代第一个级别,然后等待一个收缩手势来确定第二个级别中的内容——但是有未知数量的文件或目录。由于使用
NSPredicate
来过滤数组是相当轻量级的,我的想法是在集合视图需要计数和层次结构中某个特定级别的对象时,从一开始抓取所有文件并过滤列表。或者,更好的问题可能是,如果要在列表中显示不同级别的目录结构,最有效的方法是什么
UICollectionView
。你只是让我重复我自己的话。您是否有任何实际理由怀疑
目录的内容:
是否为“性能”?它立即直接回答了问题。或者,您应该从一个更合适的数据结构开始,从中您可以立即提取这些信息——某种层次结构和随机访问。目前,文件系统是分层和随机访问的,并且比平面阵列做得更好。主要是出于性能原因。该阵列是
UICollectionViewDataDource
的一部分,该阵列(通过挤压)在显示不同级别之间切换。我可以简单地迭代第一个级别,然后等待一个收缩手势来确定第二个级别中的内容——但是有未知数量的文件或目录。由于使用
NSPredicate
来过滤数组是相当轻量级的,我的想法是在集合视图需要计数和层次结构中某个特定级别的对象时,从一开始抓取所有文件并过滤列表。或者,更好的问题可能是,如果要在列表中显示不同级别的目录结构,最有效的方法是什么
UICollectionView
。你只是让我重复我自己的话。您是否有任何实际理由怀疑
目录的内容:
是否为“性能”?它立即直接回答了问题。或者,您应该从一个更合适的数据结构开始,从中您可以立即提取这些信息——某种层次结构和随机访问。目前,文件系统是分层和随机访问的,并且比平面阵列做得更好。