保持iOS音乐库和核心数据同步

时间:2014-09-19 14:03:59

标签: ios objective-c core-data sync

我正在编写播放器软件,需要在歌曲中添加标签。为此,我创建了一个核心数据记录。

如何让我的库与iOS音乐库保持同步?到目前为止,我的方法是获取音乐库中的歌曲列表以及CoreData中的歌曲列表。然后使用字典并搜索uuid。如果它存在,我将其从我的CoreData项目列表中删除。在这个循环之后,我只需删除CoreData项目列表中剩下的所有内容。

这种方法的问题,由于某种原因,它崩溃了NSFastEnumerationMutationHandler,这基本上意味着我试图在我删除它之后在循环中访问数组中的对象。

- (void)updateMediaLibrary {
    NSArray *mediaItems = [self getMediaItems];
    NSMutableDictionary *coreDataItems = [self getCoreDataItems];

    for (MPMediaItem *item in mediaItems) {
        NSNumber *uuid = [item valueForProperty:MPMediaItemPropertyPersistentID];
        Song *song = [coreDataItems valueForKey:[uuid stringValue]];
        if (!song) {
            [Song createSongFromMediaItem:item inContext:self.context];
        }
        else {
            [coreDataItems removeObjectForKey:[uuid stringValue]];
        }
    }

    for (Song *item in coreDataItems) {
        [Song deleteSongWithUID:item.libKey inContext:self.threadContext];
    }
}

我可能只是盲目但由于某种原因我无法在此代码中看到我的错误。

您是否有其他/更好的建议,如何让歌曲保持同步?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

对我来说,问题可能来自那个方法:

[Song createSongFromMediaItem:item inContext:self.context]

或者从那个方法:

[Song deleteSongWithUID:item.libKey inContext:self.threadContext].

他们可能会在枚举期间修改NSArray和/或NSMutableDictionary

你可以做的一件事是:

NSArray *mediaItems = [self getMediaItems].copy;
NSMutableDictionary *coreDataItems = [self getCoreDataItems].mutablecopy;

答案 1 :(得分:0)

不是列出实际的coreDataItems,而是列出持久性密钥并使用它来完成工作,例如:

- (void)updateMediaLibrary {
    NSArray *mediaItems = [self getMediaItems];
    NSMutableSet *coreDataItems = [NSMutableSet setWithArray:[[self getCoreDataItems] allKeys]];

    for (MPMediaItem *item in mediaItems) {
        NSNumber *uuid = [item valueForProperty:MPMediaItemPropertyPersistentID];
        if (![coreDataItems containsObject:[uuid stringValue]]) {
            [Song createSongFromMediaItem:item inContext:self.context];
        }
        else {
            [coreDataItems removeObject:[uuid stringValue]];
        }
    }

    for (NSString* key in coreDataItems) {
        [Song deleteSongWithUUID:key];
    }
}