【问题标题】:NSKeyedArchiver Doesn't Seem Properly Save an MPMediaItemCollection ObjectNSKeyedArchiver 似乎没有正确保存 MPMediaItemCollection 对象
【发布时间】:2014-03-05 13:33:34
【问题描述】:

我正在尝试保存使用媒体选择器创建的歌曲的播放列表。我尝试使用Persist a MPMediaItemCollection Object Using NSUserDefaults 中提供的建议。本方案使用 NSKeyedArchiver 如下:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"];
[defaults synchronize];

那么当需要检索MPMediaItemCollection时,执行如下:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"someKey"];
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data];

虽然起初这似乎可行,但我发现随着时间的推移它并不能始终如一地工作。似乎在新软件发布后加载我的应用程序后,播放列表中的某些媒体项目已损坏。例如,当我尝试从检索到的 MPMediaItemCollection 加载歌曲标题以在 tableView 中显示时,如下所示:

MPMediaItem *anItem = (MPMediaItem *)[mediaItemCollection.items objectAtIndex: row];

if (anItem) {
    cell.textLabel.text = [anItem valueForProperty:MPMediaItemPropertyTitle];

    if (cell.textLabel.text == nil) {
        NSString * persistentID = [anItem valueForProperty:MPMediaItemPropertyPersistentID];
        ...
}

某些条目的歌曲名称为零。如果我尝试在队列中的该索引处获取歌曲的 persistentID,则会有一个 persistentID,但它并不指向有效的歌曲(因此它可能只是垃圾)。

所以问题是:是否可以保存我可以确定在所有启动和软件升级(包括我的升级和 iOS 升级)中都有效的 MPMediaItemCollection。如果有,怎么做?

【问题讨论】:

    标签: ios nskeyedarchiver mpmediaitem mpmediaitemcollection nskeyedunarchiver


    【解决方案1】:

    答案不是这样的! MPMediaItemCollection 对象不能转换为 NSArray、NSDictionary 或我们可以在 NSUserDefaults 中存档的任何其他对象。

    我的建议是遍历集合,保存[anItem valueForProperty:MPMediaItemPropertyPersistentID]s的数组。保存在NSUserDefaults

    然后在应用程序的下一次运行中,您读取并枚举 NSArray 并使用具有 persistentID 的项目创建 MPMediaItemCollection。

    希望对你有帮助

    【讨论】:

    • 好的,谢谢。我猜stackoverflow.com/questions/5702707/… 的链接提供了所需的实现。唯一困扰我的是 Apple 对persistentID 的评论。它说“不能保证该值在同步/不同步/同步周期中持续存在。”你知道这意味着什么吗?
    • 当然,这是真的。这意味着如果用户从设备中取消同步曲目,然后重新同步相同的曲目,则 ID 会更改为相同的音乐,这没关系。如果您想在同步期间保存可保留的音乐数组,您可以保存字典数组:@{"trackName" : @"", @"artistName": @""} 而不是 userdefaults 中的 persistentID 并查询歌曲每次运行应用程序。但我不会推荐这个,因为当歌曲数量很多时它可能会很贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多