当NSFetchedResultsChangeUpdate更改类型发生时?

时间:2011-05-29 14:05:10

标签: iphone ios core-data nsfetchedresultscontroller

我想知道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的未解之谜 - 从未发现它。

1 个答案:

答案 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”,用户小提琴创建各种拥有的关系,然后命中取消,我只是废弃上下文,没有撤消管理需要)