保持iOS音乐库与核心数据同步
我正在编写一个播放器软件,需要为歌曲添加标签。为此,我创建了一个核心数据记录 如何使我的音乐库与iOS音乐库保持同步?到目前为止,我的方法是获取音乐库中的歌曲列表,以及CoreData中的歌曲列表。然后使用字典搜索uuid。如果存在,我将其从CoreData项目列表中删除。在这个循环之后,我只需删除coredataitems列表中剩下的所有内容 这种方法的问题在于,由于某种原因,它与NSFastEnumerationMutationHandler一起崩溃,这基本上意味着我在移除循环中的数组中的对象后,试图访问该对象保持iOS音乐库与核心数据同步,ios,objective-c,core-data,sync,Ios,Objective C,Core Data,Sync,我正在编写一个播放器软件,需要为歌曲添加标签。为此,我创建了一个核心数据记录 如何使我的音乐库与iOS音乐库保持同步?到目前为止,我的方法是获取音乐库中的歌曲列表,以及CoreData中的歌曲列表。然后使用字典搜索uuid。如果存在,我将其从CoreData项目列表中删除。在这个循环之后,我只需删除coredataitems列表中剩下的所有内容 这种方法的问题在于,由于某种原因,它与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];
}
}
我可能只是瞎了眼,但出于某种原因,我看不到这段代码中的错误
您是否有其他/更好的建议,如何保持歌曲同步
谢谢你的帮助 对我来说,问题可能来自于这种方法:
[Song createSongFromMediaItem:item inContext:self.context]
[Song deleteSongWithUID:item.libKey inContext:self.threadContext].
或者通过该方法:
[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;
与其列出实际的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];
}
}
谢谢,这让我对我的错误有了一个基本的了解。必须使用coreDataItems数组的第二个副本