带有 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 的谓词比较