【问题标题】:NSPredicate with BOOL and reloading data using NSFetchedResultController delegatesNSPredicate 与 BOOL 并使用 NSFetchedResultController 委托重新加载数据
【发布时间】:2014-04-18 15:03:26
【问题描述】:

我在使用 CoreData 和 NSFetchedResultController 时发现了非常奇怪的问题。

我正在显示从该谓词返回的 UITableView(使用 NSFetchedResultController)元素:

NSPredicate *activeFilterPredicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(properties, $x, ($x.type == %@) AND ($x.deleted == %@)).@count > 0)", @"sales/lead", [NSNumber numberWithBool:NO]];

当我手动重新加载元素或在同一个 NSManagedObjectContext 上修改它们时,它工作正常。 我的应用程序还从网络服务器更新自身 - 而不是在子线程上我正在修改它并通过父子关系保存。

来自 NSFetchedResultsController 委托的所有方法都可以正常工作 - 对于其他 NSPredicates 我有一切正常。

经过 1 天的分析和尝试确定问题后,问题似乎在这部分:

($x.deleted == %@).

似乎当它被子上下文修改时,父上下文的 NSPredicate 不能正常工作并且没有过滤掉它应该过滤的条目。

当我将属性切换到 NSString 而不是 NSNumber 并将 YES/NO 编码到 NSString 时 - 它起作用了。

有没有人遇到过这个问题,现在该如何解决?我想在最后切换到使用 BOOL 属性。

我已经尝试过 (deleted == NO) - 没有帮助

【问题讨论】:

标签: ios nspredicate nsfetchedresultscontroller


【解决方案1】:

使用关系谓词获取结果控制器是一个大问题。我在我们自己的应用程序中也看到了这一点。从 7 月 3 日 (rdar://14373992) 开始,我有一个针对此问题的错误报告开放,但它已开放。

作为一种解决方法,我们最终对数据进行了一些非规范化处理,基本上每次更改关系都会更新主对象上的属性。无论如何,从长远来看,这是一个更好的解决方案,因为在获取结果控制器中访问该属性比迭代每个对象的关系要高效得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多