Когда происходит изменение типа NSFetchedResultsChangeUpdate? - PullRequest
2 голосов
/ 29 мая 2011

Интересно, когда NSFetchedResultsChangeUpdate изменение типа в controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: методе пройдено?

Я создал NSFetchedResultsController с ненулевым sectionNameKeyPath и запросом выборки с sortDescriptor. Добавлено несколько объектов, которые соответствуют предикату извлеченного запроса. Затем я попробовал как изменить свойство сортировки, так и свойство 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 голос
/ 01 июня 2011

Я получаю это значение 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

(причина, по которой я создаю второй контекст, связана с различными вариантами использования; один случай: «новый объект foo», пользователь тратит время на создание множества собственных отношений, затем нажимает «отмена», я просто удаляю контекст, не отменяю управление необходимо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...