Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保持iOS音乐库与核心数据同步_Ios_Objective C_Core Data_Sync - Fatal编程技术网

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

保持iOS音乐库与核心数据同步,ios,objective-c,core-data,sync,Ios,Objective C,Core Data,Sync,我正在编写一个播放器软件,需要为歌曲添加标签。为此,我创建了一个核心数据记录 如何使我的音乐库与iOS音乐库保持同步?到目前为止,我的方法是获取音乐库中的歌曲列表,以及CoreData中的歌曲列表。然后使用字典搜索uuid。如果存在,我将其从CoreData项目列表中删除。在这个循环之后,我只需删除coredataitems列表中剩下的所有内容 这种方法的问题在于,由于某种原因,它与NSFastEnumerationMutationHandler一起崩溃,这基本上意味着我在移除循环中的数组中的对

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

如何使我的音乐库与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数组的第二个副本