我想知道NSFetchedResultsChangeUpdate
方法中的controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
更改类型何时通过?
我创建了NSFetchedResultsController
非{n} sectionNameKeyPath
和获取sortDescriptor
的请求。添加了几个与提取的请求谓词匹配的对象。然后我尝试更改其中一个对象的sort属性和sectionNameKeyPath
属性。实际上它工作正常:更改的对象围绕tableView移动,但每次我收到NSFetchedResultsChangeMove
更改类型!更改该对象的其他道具(不用于排序或部分)根本不会触发controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
!
我对NSFetchedResultsChangeUpdate
感兴趣的原因是我希望NSFetchedResultsController
在已经获取的对象的某些属性在匹配NSFetchedResultsController.fetchRequest.predicate
的边界中发生更改时通知我。例如,谓词将某个实体的对象与prop == 1 OR prop == 2
匹配。但我也希望在其中一个匹配的对象将prop
值从1更改为2时收到通知。
只是不想创建两个NSFetchedResultsController
,因为我相信有更优雅的方式。 + NSFetchedResultsChangeUpdate
更改类型是我唯一尚未发现的关于NSFetchedResultsController
的未解之谜 - 从未发现它。
答案 0 :(得分:1)
当我创建第二个托管对象上下文,使用相同的持久性存储,编辑对象的值,然后将上下文保存到持久性存储中时,我收到此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
= nil
(我创建第二个上下文的原因是针对各种用例;一个案例:“new foo object”,用户小提琴创建各种拥有的关系,然后命中取消,我只是废弃上下文,没有撤消管理需要)