NSFetchedResultsChangeType应该是NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete

时间:2015-05-25 02:01:53

标签: ios objective-c core-data magicalrecord

我正在使用Magical Record进行核心数据操作。在表视图控制器中,我设置了NSFetchResultsController,如下所示:

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被解雇,但它是正确的。

1 个答案:

答案 0 :(得分:0)

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

所以只需将所有内容放在相同的“NSManagedObjectContext”中即可。