【问题标题】:NSMutableArray filter objects using NSPredicate issueNSMutableArray 使用 NSPredicate 问题过滤对象
【发布时间】:2014-11-26 09:36:16
【问题描述】:

我有带有 .mp3 格式的音乐文件对象的 NSMutableArray。从文档目录中获取的所有项目。我的问题是我得到 .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等文件??

谢谢

【问题讨论】:

    标签: ios objective-c iphone


    【解决方案1】:

    使用NSStringpathExtension 获取文件扩展名(如果有),或使用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
    }
    

    【讨论】:

      【解决方案2】:

      只需使用filterUsingPredicate:方法:

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

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

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

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

      【讨论】:

        【解决方案3】:
        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];
        

        【讨论】:

          【解决方案4】:

          无论如何,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];
          

          【讨论】:

          • 很有帮助。如果我在 .MP3 和 .mp3 中有扩展名怎么办。是的,我说的是区分大小写。 :-)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多