繁体   English   中英

NSNumber for MPMediaItemPropertyPersistentID到NSString并再次返回

[英]NSNumber for MPMediaItemPropertyPersistentID to NSString and back again

我正在使用以下代码循环播放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]];

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

这工作得很好,到目前为止没有问题:

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.

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

我遇到了一些非常相似的东西并制定了以下内容:

NSNumber *musicIdentifier = [[[NSNumberFormatter alloc] init] numberFromString: persistentID];
MPMediaQuery *query = [[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:[MPMediaPropertyPredicate predicateWithValue:musicIdentifier forProperty:MPMediaItemPropertyPersistentID]]];

MPMediaItem *item = query.items.firstObject;

如果我理解正确,你试图将NSString转换为NSNumber 为此,您可以使用NSNumberFormatter 看一下numberFromString:方法。

NSNumberFormatter类参考

我只需要做同样的事情。 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];

这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM