使用 NSFetchedResultsController 获取对象的 属性

Using NSFetchedResultsController to fetch an object's property

我需要发出一个 CoreData 获取请求来获取 "List" 类型的 ManagedObject,其属性包括:name(String)、hitCount(Int)、lastUpdated(Date) 和 contents(OrderedSet)。现在我需要用列表对象的内容 属性 中的 "Media" ManagedObjects 填充我的 TableView。当我已经有了我想要的内容的列表实例时,我已经尝试过...

let fetchRequest = NSFetchRequest<Media>(entityName: "Media")
fetchRequest.predicate = NSPredicate(format: "SELF in %@", list.contents)

...这给了我 CoreData 中已有的内容,但没有对通过网络调用获得并在我最初抓取后添加到数据库中的其他对象进行任何 NSFetchedResultsControllerDelegate 更新。我也试过了...

let fetchRequest = NSFetchRequest<Media>(entityName: "List")
fetchRequest.predicate = NSPredicate(format: "name == %@", list.name)

...returns List 项和我将获得 NSFetchedResultsControllerDelegate 更新,但仅在 List 对象本身上移动类型 - 而不是应用于 TableView 所需的实际更改(delete/insert,etc) 当它的内容 属性 改变时。有没有办法实现我想要做的事情?非常感谢任何帮助。

如果反向关系是一对一,称为listRelationship,那么你可以使用:

let fetchRequest = NSFetchRequest<Media>(entityName: "Media")
fetchRequest.predicate = NSPredicate(format: "listRelationship == %@", list)

作为 FetchedResultsController 的底层提取。如果关系是对多关系,则将谓词更改为 "ANY listRelationship == %@"。无论哪种情况,都很难确保 FRC 使用的排序顺序与 List 对象中的 NSOrderedSet 相匹配。

如果这对您很重要,您将需要使用索引属性对排序顺序进行显式建模。如果关系是一对一的,您可以将 index 属性添加到 Media 实体,但如果是一对多的关系,生活就会变得更加困难:一个 Media 对象可能是一个列表中的第一项,但另一个列表中的最后一项 - 因此索引与特定列表和特定媒体项相关。在这种情况下,添加另一个实体 "ListEntry",具有 index 属性和与 ListMedia 的一对一关系(每个都有一对多逆)。