2013-04-24 55 views
0

鑑於該文件目錄中的下列文件 -過濾文件的NSArray?

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

的,而且是我們的NSURLsNSArray這些文件,是否有可能使用NSPredicate由路徑或路徑/子路徑的濾鏡陣列?例如

  • 層次結構中的第一級的一切獨特的名字(動物,汽車,照片)
  • 在第二級的一切獨特的名稱(鳥,貓)
  • 文件中的動物目錄 - (/動物)
  • 文件中的貓目錄 - (/動物/貓)

回答

3

由於這些都是在實際文件目錄實際文件的URL,爲什麼不使用的NSFileManager contentsOfDirectoryAtURL:?它直接回答你所問的問題(「貓目錄中的文件」)。

或者,爲了獲得更多的功能,使用NSDirectoryEnumerator循環訪問文件。

+0

主要是出於性能原因。該數組是UICollectionViewDataDource的一部分,它在顯示各個級別之間切換(通過捏)。我可以簡單地遍歷第一級,然後等待捏合手勢以確定第二級中的內容 - 但是存在未知數量的文件或目錄。由於使用'NSPredicate'過濾數組是相當輕量級的,因此我的想法是在開始時抓取所有文件,並在收集視圖需要來自層次結構中特定級別的計數和對象時過濾列表。 – memmons 2013-04-24 13:59:32

+0

或者,如果你想在'UICollectionView'中顯示不同級別的目錄結構,可能會有更好的問題。 – memmons 2013-04-24 14:23:26

+0

你只是讓我重複自己。你有任何真實的*理由*懷疑「contentsOfDirectoryAtURL:」是「性能」嗎?它*直接*回答問題,*立即*。或者,你應該從更合適的數據結構開始,從中你可以立即提取這些信息 - 分層和隨機訪問。就目前而言,文件系統*是分層和隨機訪問的,並且會比平面陣列做得更好。 – matt 2013-04-24 16:32:59

2

如果你真的想過濾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" 
) 

注意:它匹配子字符串,所以它不會匹配「/動物「在這種情況下,因爲主導斜線(除非數組和子字符串包含'/')。