NSFetchedResultsController не обновляется при изменении контекста управляемого объекта - PullRequest
1 голос
/ 04 ноября 2011

Я создаю программу, в которой иногда перемещаю один якорь на другой

Когда я перемещал эти якоря, я пересчитывал расстояние между двумя якорями (до и после якорей). Вычисление выполняется в фоновом режиме

Я использовал этот стандартный код для обновления

+(void)commit {
    // get the moc for this thread

    [Tools breakIfLock];
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSThread *thread = [NSThread currentThread];

    DLog(@"threadKey commit%@" , [[self class]threadKey]);

    if ([thread isMainThread] == NO) {
        // only observe notifications other than the main thread
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:moc];
    }

    NSError *error;
    if (![moc save:&error]) {
        CLog(@"Error in Saving %@", error);
        DLog(@"What the hell error is it");
    }
    else{

    }

    if ([thread isMainThread] == NO) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];
    }
    //[GrabClass StopNetworkActivityIndicatorVisible];

}

+(void)contextDidSave:(NSNotification*)saveNotification {

    dispatch_async(dispatch_get_main_queue(), ^{
        BadgerNewAppDelegate *delegate = [BNUtilitiesQuick appDelegate];
        DLog (@"currentThreadinContextDidSave: %@",[self threadKey]); 
        NSManagedObjectContext *moc = delegate.managedObjectContext; //delegate for main object
        CLog(@"saveNotification : %@",saveNotification);
        [moc mergeChangesFromContextDidSaveNotification:saveNotification];
    });


    //[moc performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:saveNotification waitUntilDone:YES];
}

Я ломаю точку и вижу, что расстояния действительно обновляются. Все хорошо

Однако NSFetchedResultsController fetchedObjects, похоже, не обновляется и все еще использует старое значение.

Как это может быть?

Также

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    DLog(@"controllerWillChangeContent: %@", controller);
    [self.tableViewA beginUpdates];
}

никогда не вызывается, хотя NSManagedObjectContext имеет изменения.

Ну, на самом деле я не был уверен, изменился ли managedObjectContext или нет. Откуда мне знать? Я имею в виду, что изменятся в managedObjectContext, чтобы гарантировать изменения в fetchController.fetchedObjects.

Насколько я знаю, кеширования нет. Как я могу быть уверен в этом тоже?

1 Ответ

4 голосов
/ 18 сентября 2012

NSFetchedResultsController документация для fetchedObjects состояний свойств:

В массив результатов входят только экземпляры объекта, указанного запрос на выборку (fetchRequest) и соответствующий его предикату. (Если запрос на выборку не имеет предиката, тогда массив результатов включает все экземпляры объекта, указанного в запросе на выборку.)

Массив результатов отражает состояние управляемых объектов в памяти в контекст управляемого объекта контроллера, а не их состояние в постоянный магазин. Однако возвращенный массив не обновляется как управляемые объекты вставлены, изменены или удалены.

Доступность Доступно в iOS 3.0 и более поздних версиях.

Я не могу сказать, каков подходящий обходной путь. Моя первая мысль - вызвать performFetch: в controllerDidChangeContent: в реализации делегата.

Массив fetchedObjects обновляется просто путем переопределения controllerDidChangeContent: пустой реализацией. Это тот случай, когда используется iPad и симулятор iPad для iOS 5.1.

Ясно, что есть некоторая разница между документацией и тем, что я наблюдал. У меня нет объяснения. Сожалею. Я могу только предложить вам выполнить выборку в controllerDidChangeContent: просто для безопасности.

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