带有NSPredicate“SELF IN%@”的NSFetchedResultsController仅在app重启后才有效

时间:2012-07-31 18:07:09

标签: ios nspredicate nsfetchedresultscontroller

我有一个带有NSFetchResultsController(frc)的UITableViewController(TVC)填充它。这是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首次执行抓取,看到那里没有&#34;产品&#34;实体并使用refreshProductCatalog请求它们。添加新实体后,感觉&#34;感觉&#34;并优雅地重新加载TVC项目(如果是TVC,则自己是代表)。

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

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

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

这里有什么问题吗? 谢谢;)

1 个答案:

答案 0 :(得分:0)

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