我正在使用以下代码循环播放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
让我搜索我。
我正在使用以下代码进行搜索:
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]];
我已经尝试了所有标准的方法,但没有占上风。
答案 0 :(得分:15)
这项工作非常顺利,到目前为止没有任何问题:
unsigned long long ullvalue = strtoull([persistentID UTF8String], NULL, 0);
NSNumber * numberID = [[NSNumber alloc] initWithUnsignedLongLong:ullvalue];
MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:numberID forProperty:MPMediaItemPropertyPersistentID];
[numberID release];
// And so on.
希望这可以帮助遇到此问题的其他人。
答案 1 :(得分:0)
如果我理解正确,您正在尝试将NSString
转换为NSNumber
。为此,您可以使用NSNumberFormatter
。看一下numberFromString:
方法。
答案 2 :(得分:0)
我只需要做同样的事情。 MPMediaItemPropertyPersistentID的查询谓词必须作为NSNumber传递。我从另一个StackOverflow帖子中找到了将NSString转换为NSNumber的答案:
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * persistentIDasNumber = [f numberFromString:persistantID];
[f release];
MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:persistentIDasNumber forProperty:MPMediaItemPropertyPersistentID];
这对我有用。
答案 3 :(得分:0)
我遇到了一些非常相似的东西并制定了以下内容:
NSNumber *musicIdentifier = [[[NSNumberFormatter alloc] init] numberFromString: persistentID];
MPMediaQuery *query = [[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:[MPMediaPropertyPredicate predicateWithValue:musicIdentifier forProperty:MPMediaItemPropertyPersistentID]]];
MPMediaItem *item = query.items.firstObject;