NSFetchedResultsController обновляется только с удалением объектов, но не с вставками - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть NSFetchedResultsController, который в основном обновляет UITableView со списком объектов, обновляемых в фоновом режиме. NSOperation создает / обновляет вызов API из веб-службы. Я реализовал различные методы NSFetchedResultsControllerDelegate (например, controllerWillChangeContent, controller:didChangeObject:atIndexPath:forChangeType:newIndexPath и т. Д.) С кодом с этого сайта: http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller

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

Ниже приведен код для создания экземпляра NSFetchedResultsController:

 - (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    // is a nearby category of objects - check to see if passed in
    if (self.nearbyCat == nil) return nil;

    // Creates a new NSManagedObjectContext
    NSManagedObjectContext *moContext = [[Utils getUtils] newManagedObjectContext];
    NSFetchRequest *req = [[NSFetchRequest alloc] init];
    NSEntityDescription *nearbyObjDesc = [NSEntityDescription entityForName:ENTITY_NAME_OBJECT inManagedObjectContext:moContext];
    [req setEntity:nearbyObjDesc];

    // predicate key path is passed into the view controller is an ivar - fetchKeyPath
    NSString *predKeyPath = self.fetchKeyPath;
    NSString *catName = [self.nearbyCat valueForKey:kCategoryNameKey];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(%K like %@)", 
                         predKeyPath, catName];
    [req setPredicate:pred];
    [predKeyPath release];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:kObjectScoreKey ascending:NO];
    [req setSortDescriptors:[NSArray arrayWithObject:sort]];
    [req setFetchBatchSize:20];

    _cacheName = [[NSString alloc] initWithFormat:@"NearbyObjectsFor%@", catName];

    // In case there are new objects created because of change in location, 
    // we delete from the cache first, keeping the cache fresh.
    [NSFetchedResultsController deleteCacheWithName:_cacheName];

    NSFetchedResultsController *myFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:moContext sectionNameKeyPath:nil cacheName:_cacheName];
    [moContext release];

    self.fetchedResultsController = myFetchedResultsController;
    _fetchedResultsController.delegate = self;

    [sort release];
    [req release];
    [myFetchedResultsController release];

    return _fetchedResultsController;
}

Я использую рекомендованный метод регистрации для NSManagedObjectContextDidSaveNotification, а затем выполняю mergeChangesFromContextDidSaveNotification: в главном потоке в методе mergeContextChanges ниже:

- (void)mergeContextChanges:(NSNotification *)note 
{ 
    if(note.object && self.fetchedResultsController)
    {

        SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
        [[self.fetchedResultsController managedObjectContext] performSelectorOnMainThread:selector withObject:note waitUntilDone:YES];
    }
}

Кто-нибудь сталкивался с подобной проблемой раньше?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

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

По сути, я слушаю уведомление, которое публикуется при возврате успешного запроса из веб-службы. Затем я переключаюсь на другой экземпляр NSFetchedResultsController, выполняю выборку и вызываю метод обновления таблицы. Я вижу некоторую анимацию, но это для всей таблицы, а не только для соответствующих строк; Я рассматриваю это как компромисс для получения данных в фоновом режиме.

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

Несколько псевдокодов для метода обработки уведомлений:

method handleServiceRetrievalSuccess
    Get current fetched results controller, frcA
    Release frcA
    Instantiate new fetched results controller, frcB
    Set frcB as current fetched results controller
    frcB->performFetch
    Reload table view
0 голосов
/ 16 сентября 2011

После того, как вставка была выполнена и успешно сохранена, позвоните

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