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'中,它就可以工作。