我正在编写播放器软件,需要在歌曲中添加标签。为此,我创建了一个核心数据记录。
如何让我的库与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];
}
}
我可能只是盲目但由于某种原因我无法在此代码中看到我的错误。
您是否有其他/更好的建议,如何让歌曲保持同步?
感谢您的帮助!
答案 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];
}
}