使用NSFetchedResultsController获取对象的属性

时间:2017-02-24 00:32:00

标签: ios core-data nsfetchedresultscontroller nsfetchrequest

我需要创建一个CoreData获取请求来获取类型为" List"的ManagedObject。哪些属性包括:name(String),hitCount(Int),lastUpdated(Date)和contents(OrderedSet)。现在我需要使用" Media"填充我的TableView。 List对象的contents属性中的ManagedObjects。当我已经拥有了List的实例时,我想要我尝试过......

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)

...返回List项,我将获得NSFetchedResultsControllerDelegate更新,但只有类型在List对象本身上移动 - 而不是当它&#39时应用于TableView(删除/插入等)所需的实际更改; s内容属性更改。有没有办法实现我想要做的事情?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果反向关系为1,称为listRelationship,则可以使用:

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

作为FetchedResultsController的底层提取。如果关系为-to,则将谓词更改为“ANY listRelationship ==%@”。在任何一种情况下,都很难确保FRC使用的排序顺序与List对象中的NSOrderedSet匹配。

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