Вставки базовых данных в NSFetchedResultsController не видны до перезапуска приложения - PullRequest
2 голосов
/ 23 февраля 2012

Я столкнулся с загадочной проблемой:

У меня есть только один метод для вставки объектов в Core Data.Я пытаюсь вставить данные двумя разными способами: один из UITableView с кнопкой +.Другой из обычного UIViewController, вызывая метод ниже.

В конце метода метод возвращает NSManagedObject в обоих случаях, но счетчик fetchedObjects увеличивается только в случае вставки из UITableViewController,

Если я сначала загружаю UITableViewController, все последующие вызовы метода правильно увеличивают количество извлекаемых объектов.Если я этого не сделаю, число останется прежним, даже если NSManagedObjects возвращаются из метода. При последующем перезапуске приложения «невидимые» объекты загружаются снова и становятся видимыми

Мне кажется, что проблема связана с ManagedObjectContext, но я не вижу, где я неправильно его установил,

В проекте используются iOS5, ARC и раскадровки.

-(Event*)insertAndReturnNewEventWithSeverity:(int)type
{
    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];

    Event *newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];


    newManagedObject.insert_datetime = [NSDate date];



    NSError *error = nil;
    if (![context save:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //        abort();
    }

    NSLog(@"objects: %i", self.fetchedResultsController.fetchedObjects.count );

    return newManagedObject;
}

Существует только один контекст managedObject, который инициализируется в делегате приложения.

-(NSManagedObjectContext*)managedObjectContext
{
    if(__managedObjectContext!=nil)
    {
        return  __managedObjectContext;
    }else{

        self.managedObjectContext = self.appDelegate.managedObjectContext;    
    }
    return __managedObjectContext;
}

ОБНОВЛЕНИЕ: Добавление моего UIViewController в качестве делегата к NSFetchedResultsController и добавление didChangeObject и didChangeSection заставляет свойство .fetchedObjects корректно увеличиваться само по себе!

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.coreDataManager.fetchedResultsController.delegate = self;
}

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
           atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
          newIndexPath:(NSIndexPath *)newIndexPath
    {
        NSLog(@"Changed object");
    }

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
               atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
    {
      NSLog(@"Changed section");
    }

Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

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

Таким образом, контроллер имеет три режима работы, определенных по тому, есть ли у него делегат и задано ли имя файла кэша.

Нет отслеживания: делегат установлен на ноль. Контроллер просто обеспечивает доступ к данным, как это было при выполнении выборки.

> Отслеживание только в памяти: делегат не ноль и имя кэша файла установлен на ноль. Контроллер контролирует объекты в своем наборе результатов и обновляет раздел и информацию о заказе в ответ на соответствующие изменения.

Полное постоянное отслеживание: делегат и имя кэша файла не-ноль. Контроллер контролирует объекты в своем наборе результатов и обновляет раздел и заказ информации в ответ на соответствующие изменения. Контроллер поддерживает постоянный кэш результатов его вычисление.

https://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

1 голос
/ 23 февраля 2012

Для правильного подсчета объектов fetchedObjects NSFetchedResultsController вам необходимо установить делегата для вашего NSFetchedResultsController.

Что Apple говорит об этом:

Делегат контроллера

Если вы установите делегата для контроллера выбранных результатов, контроллер зарегистрируется для получения уведомлений об изменениях из контекста своего управляемого объекта.Любые изменения в контексте, которые влияют на набор результатов или информацию раздела, обрабатываются, и результаты обновляются соответствующим образом.Контроллер уведомляет делегата, когда результирующие объекты меняют местоположение или когда секции изменяются (см. NSFetchedResultsControllerDelegate).Обычно эти методы используются для обновления отображения табличного представления.

...