5

我正在使用以下代码循环播放 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 有一个NSString它应该播放的曲目的 PersistentID。

再次循环播放每首歌曲并比较 PersistentID 直到找到我想要的曲目会很麻烦,所以我尝试使用MPMediaPropertyPredicateiPhone 搜索我。

我正在使用以下代码进行搜索:

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]];

我已经尝试了所有标准的方法,但没有占上风。

4

4 回答 4

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.

希望这对遇到此问题的其他人有所帮助。

于 2011-01-18T21:56:03.933 回答
0

如果我理解正确,您正在尝试将 an 转换NSStringNSNumber. 为此,您可以使用NSNumberFormatter. 看看numberFromString:方法。

NSNumberFormatter 类参考

于 2011-01-18T18:09:06.603 回答
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];

这对我有用。

于 2011-09-21T18:08:22.550 回答
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;
于 2015-01-08T14:45:38.023 回答