如果你真的想過濾NSURLs的數組,你可以做這樣的事情:
- (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"
)
注意:它匹配子字符串,所以它不會匹配「/動物「在這種情況下,因爲主導斜線(除非數組和子字符串包含'/')。
主要是出於性能原因。該數組是UICollectionViewDataDource的一部分,它在顯示各個級別之間切換(通過捏)。我可以簡單地遍歷第一級,然後等待捏合手勢以確定第二級中的內容 - 但是存在未知數量的文件或目錄。由於使用'NSPredicate'過濾數組是相當輕量級的,因此我的想法是在開始時抓取所有文件,並在收集視圖需要來自層次結構中特定級別的計數和對象時過濾列表。 – memmons 2013-04-24 13:59:32
或者,如果你想在'UICollectionView'中顯示不同級別的目錄結構,可能會有更好的問題。 – memmons 2013-04-24 14:23:26
你只是讓我重複自己。你有任何真實的*理由*懷疑「contentsOfDirectoryAtURL:」是「性能」嗎?它*直接*回答問題,*立即*。或者,你應該從更合適的數據結構開始,從中你可以立即提取這些信息 - 分層和隨機訪問。就目前而言,文件系統*是分層和隨機訪問的,並且會比平面陣列做得更好。 – matt 2013-04-24 16:32:59