如果我点击一个单元格并进行后台核心数据刷新,我的单元格将被取消选择。
经过调查后,我NSFetchedResultsControllerDelegate
controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
的{{1}}实施方式被调用NSFetchedResultsChangeMove
但indexPath
和newIndexPath
相同(即相同的行/节值)。
NSFetchedResultsChangeUpdate
类型无法调用。
我controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
的实施是Apple的文档中提供的典型实现。我相信转自:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
...
switch(type) {
...
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
为:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
...
switch(type) {
...
case NSFetchedResultsChangeMove:
if (indexPath.section != newIndexPath.section || indexPath.row != newIndexPath.row) {
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
break;
}
}
会解决我的问题。
我的问题是:此修复程序是正确的还是我错过了可以解释为什么我的更新属于NSFetchedResultsChangeMove
类型的内容?
答案 0 :(得分:0)
我的问题是,我正在为NSManagedObject
个实例分配值,这些实例与以前相同。即,如果foo.bar
为2,我会调用API并在我的对象上调用新的foo.bar = 2
赋值。即使价值相同,Core Data仍在考虑价值已发生变化。
我得到NSFetchedResultsChangeMove
类型而不是NSFetchedResultsChangeUpdate
类型仍然很奇怪,但是嘿。
我采取的措施是:
if ([object.changedValues count] == 0) {
// Reverting changed on object
[context refreshObject:object mergeChanges:NO]
}
在每次更新结束时,而不是逐个比较属性。