0

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

Animals/Birds/file1.xyz
Animals/Birds/file2.xyz
Animals/Cats/file1.xyz
Cars/Ford/file1.xyz
Photos/MyAlbums/file1.xyz

鉴于我们对这些文件有一个NSArrayof NSURLs,是否可以使用 anNSPredicate按路径或路径/子路径过滤数组?例如

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

2 回答 2

3

由于这些是实际 Documents 目录中的实际文件 URL,为什么不使用 NSFileManagercontentsOfDirectoryAtURL:呢?它直接回答了您提出的问题(“Cats 目录中的文件”)。

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

于 2013-04-24T04:16:55.077 回答
2

如果你真的想过滤一个 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”,因为前导斜杠(除非数组和子字符串都包含“/”)。

于 2013-04-24T04:26:59.873 回答