NSMutableArray使用NSPredicate问题筛选对象

时间:2014-11-26 09:36:17

标签: ios objective-c iphone

我有NSMutableArray和.mp3格式的音乐文件对象。从文档目录中提取的所有项目。我的问题是我得到.sqlite文件和.mp3文件。 我只想要来自NSMutableArray的.mp3文件。我尝试使用NSPredicate,但它给出了错误的不兼容指针类型NSMutableArray / NSArray。(NSMutableArray and NSPredicate filtering

我不想要像(projectname.sqlite,projectname.sqlite-shm,projectname.sqlite-val等)这样的文件

我的代码是,

downloadedFilesArray = [[NSMutableArray alloc] init];

fileManger = [NSFileManager defaultManager];
NSError *error;
downloadedFilesArray = [[fileManger contentsOfDirectoryAtPath:fileDest error:&error] mutableCopy];

if([downloadedFilesArray containsObject:@".DS_Store"])
    [downloadedFilesArray removeObject:@".DS_Store"];

如何过滤.mp3,.m3u,.aac等文件

由于

4 个答案:

答案 0 :(得分:1)

使用NSString' pathExtension获取文件扩展名(如果有),或使用NSPredicate。另外,请记住检索目录内容时是否有NSError

NSMutableArray *mp3DownloadedFilesArray = [[NSMutableArray alloc] init];
NSString *targetFileExtension = @"mp3";

NSError *error;
NSArray *allDownloadedFilesArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDest error:&error];

if (allDownloadedFilesArray && allDownloadedFilesArray.count > 0 && !error) {
    for (NSString* fileName in allDownloadedFilesArray) {
        if ([fileName.pathExtension compare:targetFileExtension options:NSCaseInsensitiveSearch] == NSOrderedSame) {
            [mp3DownloadedFilesArray addObject:fileName];
        }
    }
} else {
    // Process the error
}

答案 1 :(得分:1)

只需使用filterUsingPredicate:方法:

[downloadedFilesArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF ENDSWITH %@", @".mp3"]];

或者对于不区分大小写的版本:

[downloadedFilesArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF ENDSWITH [cd] %@", @".mp3"]];

编辑:如果您想要使用更多文件扩展名进行过滤,则可以创建多个NSPredicates(每个扩展名一个)并使用[NSCompoundPredicate orPredicateWithSubpredicates]进行组合。抱歉,但我没有提供现成的解决方案,您必须自己实施。

答案 2 :(得分:0)

NSArray *downloadedFilesArray = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; 

// filter the array for only sqlite files  

NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.mp3' || "]; 
NSArray *sqliteFiles = [allFiles filteredArrayUsingPredicate:fltr];

答案 3 :(得分:-1)

无论如何,NSPredicate应该可以工作,但你可以自己编写过滤逻辑:

NSMutableArray* downloadedFilesArray = [[NSMutableArray alloc] init];
NSMutableArray* removeFilesArray = [[NSMutableArray alloc] init];
for (NSString* fileName in downloadedFilesArray){
    if ([fileName.lowercaseString rangeOfString:@".mp3"].location != fileName.length - 4) {
         [removeFilesArray addObject:fileName];
    }
}
[downloadedFilesArray removeObjectsInArray:removeFilesArray];