setFilterNSArrayController 上的谓词如果处于 "Auto Rearrange Content" 中则不起作用



我有一个经典的CoreData应用程序,显示它的数据在NSTableView与绑定(所有完成与XCode 4.2)。

工作很好,直到我决定昨天检查,在属性检查器中,为ArrayController的"自动重新安排内容"。现在,当我尝试在其上设置过滤器谓词时,我得到:

[<_NSFaultingMutableSet 0x102b65950> addObserver:forKeyPath:options:context:] is not supported. Key path: name

请记住,如果没有这个选项,它可以完美地工作:谓词很好,控制器可以正确地过滤它的托管内容,表视图只显示与谓词匹配的实体。

当然,我可以取消启用这个"自动重新排列内容",但它对于在实体发生变化时维护排序顺序很有用。如果我编辑一个实体,"日期修改"改变,因为我的排序顺序是在这个日期,我希望TableView重新排序它的行自动。它有这个选项,但可惜的是增加了"不支持addObserver"的错误。

_NSFaultingMutableSet来自相关实体中的多对多关系,因此称为"Set"。也许"自动重新安排内容"与"setFilterPredicate"与多对多关系不兼容?

有人有类似的问题吗?NSArrayController的内部bug ?

注意:引起问题的谓词的形式为

name CONTAINS[cd] %@ OR ANY aliases.name CONTAINS[cd] %@

ANY tags.name CONTAINS[cd] %@ OR ANY tags.aliases.name CONTAINS[cd] %@

似乎'ANY'引起了一些冲突…

找到了一个解决方案,使用上面的SUBQUERY注释

保留'auto rearrange content'选项,但将谓词更改为:

name CONTAINS[cd] %@ OR SUBQUERY(aliases, $anAlias, $anAlias.name CONTAINS[cd] %@).@count != 0

SUBQUERY(tags, $aTag, $aTag.name CONTAINS[cd] %@).@count !=0 OR SUBQUERY(tags, $aTag, $aTag.aliases.name CONTAINS[cd] %@).@count !=0

可能谓词是错误的,我只是没有遇到其他问题。