【问题标题】:NSNumber for MPMediaItemPropertyPersistentID to NSString and back againMPMediaItemPropertyPersistentID 的 NSNumber 到 NSString 并再次返回
【发布时间】: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


    【解决方案1】:

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

    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 表示解决方案。在没有转换为 NSNumber 的情况下,我尝试将 NSString 输入谓词并返回 0 个项目。试了半天多去调试。您的解决方案有所帮助。谢谢。
    【解决方案2】:

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

    NSNumberFormatter Class Reference

    【讨论】:

    • 我正在编辑我的问题以包含我尝试过的内容。数字格式化程序就是其中之一。
    【解决方案3】:

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

    这对我有用。

    【讨论】:

      【解决方案4】:

      我遇到了非常相似的事情,并得出以下结论:

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

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 2011-02-20
        • 2011-08-05
        相关资源
        最近更新 更多