首页 文章

当NSFetchedResultsChangeUpdate更改类型发生时?

提问于
浏览
2

我想知道 NSFetchedResultsChangeUpdate 方法中的 NSFetchedResultsChangeUpdate 更改类型何时通过?

我用非零 sectionNameKeyPath 创建了 NSFetchedResultsController ,并且获取了 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 回答

  • 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”,用户小提琴创建各种拥有的关系,然后点击取消,我只是删除上下文,不需要撤消管理)

相关问题