我想知道 NSFetchedResultsChangeUpdate
更改类型在 controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
方法中是什么时候传递的?
我已经使用非零 sectionNameKeyPath
创建了 NSFetchedResultsController
并获取了具有 sortDescriptor
的请求。添加了几个与获取的请求谓词匹配的对象。然后我尝试了更改其中一个对象的排序属性和 sectionNameKeyPath
属性。实际上它工作正常:更改对象在 tableView 周围移动,但每次我收到 NSFetchedResultsChangeMove
更改类型!更改该对象的其他 Prop (不用于排序或部分)根本不会触发 controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
!
我之所以对 NSFetchedResultsChangeUpdate
感兴趣,是因为我希望 NSFetchedResultsController
在已获取对象的某些属性在匹配 NSFetchedResultsController 的范围内发生变化时通知我。 fetchRequest.predicate
.例如,谓词匹配具有prop == 1 OR prop == 2
的某个实体的对象。但我也想在其中一个匹配对象将其 prop
值从 1 更改为 2 时收到通知。
只是不想创建两个 NSFetchedResultsController
,因为我相信有更优雅的方法。 + NSFetchedResultsChangeUpdate
更改类型是我对 NSFetchedResultsController
唯一未解的谜团 - 从未发现它。
最佳答案
我在创建第二个托管对象上下文时收到此 type
值,使用相同的持久存储,编辑对象的值,然后将上下文保存到持久存储中。
(如果我更改它排序的名称,我会得到 ChangeMove
值,如您所述。)
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
…
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath]
inTable:tableView
atIndexPath:indexPath];
break;
…
anObject
= NSManagedObject
相关更改对象的子类
indexPath
= 相关索引
newIndexPath
= 无
(我创建第二个上下文的原因是为了各种用例;一个案例:“新 foo 对象”,用户摆弄创建各种拥有的关系,然后点击取消,我只是丢弃上下文,没有撤消管理需要)
关于iphone - NSFetchedResultsChangeUpdate 更改类型何时发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6168150/