2014-09-19 103 views
0

我在写一个播放器软件,需要为歌曲添加标签。为此我创建了一个核心数据记录。让iOS音乐库和核心数据保持同步

如何让我的音乐库与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

而不是使实际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]; 
    } 
} 
+0

的第二个副本感谢您的优化。 :) – Jan 2014-09-19 16:07:58

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; 
+0

下次请格式化您的代码。 – 2014-09-19 14:48:35

+0

谢谢,这给了我一个关于我的错误的基本想法。必须使用coreDataItems数组 – Jan 2014-09-19 16:09:13