NSNumber for MPMediaItemPropertyPersistentID到NSString并再次返回

Tom*_*ing 5 iphone cocoa-touch objective-c mpmediaquery

我正在使用以下代码循环播放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];
Run Code Online (Sandbox Code Playgroud)

很基本的东西.

我将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];
Run Code Online (Sandbox Code Playgroud)

哪里persistentIDNSString早期.

奇怪的是,这适用于某些歌曲,而不适用于其他歌曲.也就是说,有时items数组不是空的,即使我传递的是一个NSString,而不是一个NSNumber.

我想知道是否有办法将我的NSString背部转换为NSNumber它的来源,以及我如何做到这一点.

更新:我已经尝试过NSNumberFormatter,我也试过类似的东西:

[NSNumber numberWithFloat:[persID floatValue]];
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ing 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.
Run Code Online (Sandbox Code Playgroud)

希望这能帮助遇到此问题的其他任何人.