mor*_*utt 10 iphone objective-c mpmediaitem mpmediaquery ios
如何以与iOS音乐应用程序相同的方式搜索iPod库?我想做一般查询,返回每个艺术家,专辑和歌曲的结果.例如,如果我搜索Kenny Chesney,我希望歌曲查询返回所有Kenny Chesney歌曲(以及包含Kenny Chesney的任何歌曲标题或专辑.)当我为每个属性(歌曲标题,专辑)创建此查询和谓词时标题,艺术家姓名),一个空数组返回.
这里有一些代码可以让您更好地了解我想要实现的目标:
MPMediaPropertyPredicate *songPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyTitle
comparisonType:MPMediaPredicateComparisonContains];
MPMediaPropertyPredicate *albumPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyAlbumTitle
comparisonType:MPMediaPredicateComparisonContains];
MPMediaPropertyPredicate *artistPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyArtist
comparisonType:MPMediaPredicateComparisonContains];
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
[songsQuery addFilterPredicate:songNamePredicate];
[songsQuery addFilterPredicate:artistNamePredicate];
[songsQuery addFilterPredicate:albumNamePredicate];
NSLog(@"%@", [songsQuery items]);
Run Code Online (Sandbox Code Playgroud)
我有这个工作通过分别运行每个谓词的查询,但这似乎非常低效!
Moh*_*bib 15
以这种方式组合您的谓词使其成为"AND"关系.这意味着您要查询的歌曲的标题,专辑和名称都与搜索文本相匹配.
要实现您要执行的操作,您应该运行3个查询并以正确的方式组合结果.
如果您运行:
MPMediaPropertyPredicate *artistPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyArtist
comparisonType:MPMediaPredicateComparisonContains];
NSSet *predicates = [NSSet setWithObjects: artistPredicate, nil];
MPMediaQuery *songsQuery = [[MPMediaQuery alloc] initWithFilterPredicates: predicates];
NSLog(@"%@", [songsQuery items]);
Run Code Online (Sandbox Code Playgroud)
这将使您与符合搜索条件的艺术家联系.你应该为歌曲和专辑做同样的事情.
如果您这样做很慢,您可以立即检索所有媒体并手动过滤它:
MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSLog(@"Logging items from a generic query...");
NSArray *itemsFromGenericQuery = [everything items];
for (MPMediaItem *song in itemsFromGenericQuery) {
NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
/* Filter found songs here manually */
}
Run Code Online (Sandbox Code Playgroud)
小智 11
这对我有用:
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];
}
Run Code Online (Sandbox Code Playgroud)
我基本上从媒体查询中获取所有项目后进行过滤.我不认为我的解决方案比首先过滤查询更好,但肯定比分别搜索三次更好.或者多次遍历数组.
| 归档时间: |
|
| 查看次数: |
9046 次 |
| 最近记录: |