【发布时间】:2011-06-11 04:09:05
【问题描述】:
我正在使用以下代码循环播放 iPhone 音乐库中的所有歌曲:
NSArray * songs = [[NSArray alloc] initWithArray:[[MPMediaQuery songsQuery] collections]];
for (MPMediaItemCollection * item in songs){
NSString * persistentID = [[[item representativeItem] valueForProperty:MPMediaItemPropertyPersistentID] stringValue];
// Do something with it.
}
[songs release];
相当基本的东西。
我将 PersistentID 作为NSString 获取,因为我需要将其写入 XML 文件(以便通过网络传输到另一台设备)。因此,我不能将其保留为 NSNumber。
然后另一台设备将通过再次传回 PersistentID 来请求 iPhone 播放曲目。
此时,iPhone 拥有它应该播放的曲目的 PersistentID 的NSString。
再次循环遍历每首歌曲并比较 PersistentID 直到找到我想要的曲目会很麻烦,所以我尝试使用MPMediaPropertyPredicate 让 iPhone 搜索我。
我正在使用以下代码进行搜索:
MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:persistentID forProperty:MPMediaItemPropertyPersistentID];
MPMediaQuery * songsQuery = [[MPMediaQuery alloc] init];
[songsQuery addFilterPredicate:predicate];
if ([[songsQuery items] count]){
MPMediaItem * item = [[songsQuery items] objectAtIndex:0];
// Play item.
}
[songsQuery release];
其中persistentID 是之前的NSString。
奇怪的是,这适用于某些歌曲,而不适用于其他歌曲。即,有时items 数组不为空,即使我传递的是NSString,而不是NSNumber。
我想知道是否有办法将我的 NSString 转换回它的来源 NSNumber,以及如何做到这一点。
更新:我试过 NSNumberFormatter,我也试过类似的东西:
[NSNumber numberWithFloat:[persID floatValue]];
我已经尝试了所有的标准方法,但没有占上风。
【问题讨论】:
标签: iphone objective-c cocoa-touch mpmediaquery