使用 MPMediaPropertyPredicate 搜索多种类型

Posted

技术标签:

【中文标题】使用 MPMediaPropertyPredicate 搜索多种类型【英文标题】:Search for multiple types with MPMediaPropertyPredicate 【发布时间】:2012-04-24 08:14:30 【问题描述】:

我有以下几点:

MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:textString 
                                                                            forProperty:MPMediaItemPropertyTitle
                                                                         comparisonType:MPMediaPredicateComparisonContains];

NSSet *predicateSet = [NSSet setWithObject:titlePredicate];
MPMediaQuery *searchQuery = [[MPMediaQuery alloc] initWithFilterPredicates:predicateSet];
NSArray *itemsFromTextQuery = [searchQuery items];

 for (MPMediaItem *song in itemsFromTextQuery) 
 
     [arrayOfSongItems addObject:song];
 

效果很好,但只搜索了曲目的标题。我希望它返回标题、艺术家和专辑名称的结果。

【问题讨论】:

【参考方案1】:

这对我有用:

MPMediaQuery *searchQuery = [[MPMediaQuery alloc] init];
NSPredicate *test = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR albumTitle contains[cd] %@ OR artist contains[cd] %@", searchString, searchString, searchString];
NSArray *filteredArray = [[searchQuery items] filteredArrayUsingPredicate:test];

//NSLog(@"%@", [filteredArray valueForKeyPath:@"title"]);

for (MPMediaItem *song in filteredArray) 

    [arrayOfSongItems addObject:song];

我基本上过滤 从媒体查询中获取所有项目。我不认为我的解决方案比首先过滤查询更好,但绝对比单独搜索三次更好。或者多次遍历数组。

【讨论】:

这一切都很好 - 但是你怎么知道它是曲目、专辑还是艺术家? 如果您需要此信息,那么不使用 3 个查询有什么问题?您可以使用我的解决方案,然后在 for 循环中检查这三个值 if ([song.title isEqualToString:searchString]) 等。或者如果您使用 3 个查询并想要合并它们,您可以在使用 if ([arr indexOfObject:@"new Item"] == NSNotFound) //add new Item 向数组中添加新元素之前进行检查> 问题在于性能。对整个库运行 3 次查询可能需要几秒钟 - 而 Apple 的音乐播放器执行速度非常快。【参考方案2】:

试试下面的代码

 MPMediaQuery* query = [MPMediaQuery albumsQuery];

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strArtist forProperty:MPMediaItemPropertyArtist]]

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strTitle forProperty:MPMediaItemPropertyAlbumTitle]];

【讨论】:

这假设两个字符串是不同的。我希望能够显示,如 iPhone 的 iPod 应用程序的搜索表、艺术家 & 或专辑 & 或找到的曲目。

以上是关于使用 MPMediaPropertyPredicate 搜索多种类型的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)