带有 NSPredicate "SELF IN %@" 的 NSFetchedResultsController 仅在应用重新启动后有效

Posted

技术标签:

【中文标题】带有 NSPredicate "SELF IN %@" 的 NSFetchedResultsController 仅在应用重新启动后有效【英文标题】:NSFetchedResultsController with NSPredicate "SELF IN %@" works only after app-restart 【发布时间】:2012-07-31 18:07:08 【问题描述】:

我有一个用 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 第一次执行 fetch,发现没有“产品”实体并使用 refreshProductCatalog 请求它们。添加新实体后,frc “感觉”它并优雅地重新加载 TVC 项目(如果 TVC,self 是委托)。

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

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

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

有什么线索吗? 谢谢;)

【问题讨论】:

【参考方案1】:

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

【讨论】:

委托方法已经到位。我从 Apple 示例中复制了它们,它们适用于另一个没有谓词的 TVC。有趣的是:尝试将 cacheName 更改为 @"Root",现在即使在应用重启后我也看不到获取的产品。即使我将它改回nil 并删除了我在模拟器中存储数据的物理文件 - 它也不起作用;)) 好的,我在发布问题后回滚了我所做的所有更改,现在我回到起点:仅在 TVC 重新加载或应用程序重新启动后,TVC 才会填充适当的产品。添加 @"Root" 作为 cacheName 没有帮助。在创建 NSFetchedResultsController 时,我需要做的不仅仅是输入这个名称吗?

以上是关于带有 NSPredicate "SELF IN %@" 的 NSFetchedResultsController 仅在应用重新启动后有效的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 与关系 @"SELF.<relationship>.<relationship>.<object> == %@"

核心数据 NSPredicate“已删除 == NO”无法按预期工作

带有 BOOL 比较的 CoreData NSPredicate 不起作用

带有 groupBy 的 nspredicate 不喜欢带有 nsdate 的谓词比较

使用“CONTAINS”运算符时,带有 NSPredicate 的 CKQuery 失败

NSPredicate 与 FUNCTION 不工作