0

我有一个 UITableViewController (TVC) 和 NSFetchResultsController (frc) 填充它。这是frc的初始化:

- (NSFetchedResultsController *)frc
{
    if (!_frc)
    {
        NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:e_product];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"product_group.product_group_name" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];                
    _frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.moc sectionNameKeyPath:@"product_group.product_group_name" cacheName:nil];
    _frc.delegate = self;
    NSError *error;
    if (![_frc performFetch:&error])
    {
        NSLog(@"Error: %@!", error.userInfo);
    }
    if (_frc.sections.count < 1)
    {
        // looks like the product list is empty!
        [self refreshProductCatalog];
    }
}
return _frc;
}

它工作得很好:当显示 TVC 时,frc 第一次执行 fetch,发现没有“产品”实体并使用 refreshProductCatalog 请求它们。添加新实体后,frc “感觉”它并优雅地重新加载 TVC 项目(如果 TVC,self 是委托)。

当我将谓词添加到 FetchRequest 时出现问题:

request.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", someManagedObject.setOfProductsEntities];

我用适当的实体在 refreshProductCatalog 中填充 someManagedObject.setOfProductsEntities (我确信因为它在重新启动后工作正常)。问题是当谓词到位时,在我更改数据并且不重新加载 TVC 之后,frc 不会“感觉到”托管对象上下文的变化。如果我离开 TVC 并再次打开它(或重新启动应用程序)一切都很好,数据已经保存...

任何线索这里有什么问题?谢谢 ;)

4

1 回答 1

0

要全面跟踪更改,缓存名称不应为 nil。我过去做错的另一件事是分配了一个委托,但忘记实现一个委托方法。

于 2012-07-31T18:15:59.157 回答