NSFetchedResultsController дублированные строки - PullRequest
7 голосов
/ 08 июня 2011

Я испытываю странное поведение при использовании вторичного потока для обновления содержимого NSFetchedResultsController, и я хотел бы знать, что это распространенная проблема, или я могу что-то делать неправильно.

У меня есть централизованный NSManagedObjectContext, находящийся в моем основном объекте делегата, который используется и используется всеми контроллерами представления. После загрузки таблицы путем выполнения выборки и вызова ее метода делегата в фоновом режиме запускается вторичный поток для обновления его результатов. Однако, и только в странных случаях, при вставке новых записей они дублируются в табличном представлении. Если я выйду и снова войду, дублированные строки исчезнут, что заставляет думать, что они существовали только в контексте управляемого объекта.

Это следующие шаги:

  1. Фоновый поток NSOperation создает ограниченный контекст, связанный с тем же постоянным хранилищем основного делегата приложения.
  2. Новый поток начинает прослушивать уведомления NSManagedObjectContextDidSaveNotification.
  3. Новые строки удаляются, обновляются или вставляются во вторичный контекст, делая всегда вызов сохранения при достижении некоторого размера пакета.
  4. При сохранении в фоновом режиме метод уведомления вызывает централизованный контекстный селектор mergeChangesFromContextDidSaveNotification в главном потоке следующим образом.

    -(void)mergeChanges:(NSNotification *)notification
    {
        NSManagedObjectContext *mainContext = [[appDelegate sharedDelegate] managedObjectContext];
    
        [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                                      withObject:notification 
                                   waitUntilDone:NO];
    }
    
  5. После завершения операции слушатель удаляется, а вторичный контекст освобождается.

Кто-нибудь имеет представление, что является причиной того, что строки моего табличного представления дублируются, и как это можно решить?

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 08 июня 2011

Вы не можете иметь «дублированные» объекты в контексте управляемого объекта, потому что каждый объект в контексте должен быть уникальным.Поддержание уникальных объектов является основной функцией контекста, поэтому этого просто не происходит.Итак, у вас есть одно из двух условий:

  1. Вы создаете два или более управляемых объекта с одинаковыми атрибутами, чтобы они вместе отображались при сортировке в виде таблицы.
  2. Ваше представление таблицыПри некоторых обстоятельствах логика источника данных возвращает к табличному виду данные из одного и того же управляемого объекта дважды.Это создало бы иллюзию, что в контексте есть дублированный управляемый объект.

Я думаю, что последнее более вероятно.

...