NSFetchedResultsChangeType应NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete

问题描述:

我正在使用魔法记录来做核心数据操作。在表视图控制器,I设置NSFetchResultsController这样的:NSFetchedResultsChangeType应NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete

self.fetchedResultsController = [Activity MR_fetchAllGroupedBy:nil withPredicate:predicateForSmart sortedBy:@"activityScore" ascending:NO delegate:self]; 

我还在控制器写对NSFetchResultsController委托方法。

现在,当我使用

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
     if (activitiesWithThisID.count > 0) { 
      Activity *activityToUpdate = [[activitiesWithThisID firstObject] MR_inContext:localContext]; 
      // Detailed update here 
      activityToUpdate.someProperty = ...; 
... 
     } 
    } completion:^(BOOL contextDidSave, NSError *error) { 

更新数据,

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

烧制的方法。但是,NSFetchedResultsChangeType总是NSFetchedResultsChangeDelete,我预计它应该是NSFetchedResultsChangeUpdate。当我使用[activityToUpdate deleteEntity]时,仍然有NSFetchedResultsChangeDelete被解雇,但它是正确的。

Bug修复。我使用NSPredict来查找数据,然后更新条目。但是,此前的查找操作在另一个NSManagedObjectContext中。但是,NSFetchedResultsController存在问题。该错误最终是在谓词的内存评估过程中(以查看新插入的对象是否属于控制器),谓词最终会做指针比较。由于有两个托管对象上下文,指针比较将失败。所以控制器最终认为新的对象不是结果集的一部分。

所以只需将所有内容放在同一个'NSManagedObjectContext'中,它就可以工作。