2017-02-24 103 views
1

我需要创建一个CoreData获取请求来抓取类型为“List”的ManagedObject,其中的属性包括:name(String),hitCount(Int),lastUpdated(Date)和contents(OrderedSet) 。现在我需要使用List对象的contents属性中的“Media”ManagedObjects填充我的TableView。当我已经有名单的一个实例是谁的内容,我想我已经试过......使用NSFetchedResultsController获取对象的属性

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) 

...返回列表项,我会得到NSFetchedResultsControllerDelegate更新,但只有列表对象本身的类型举动 - 不适用于需要TableView中的实际变化(删除/插入等),当它的内容属性发生变化时。有没有办法实现我想要做的事情?任何帮助是极大的赞赏。

+1

从媒体到列表你有相反的关系吗?如果是这样,是一对多还是多对象:Media对象可以与多个List关联吗? (你需要的谓词在每种情况下都是不同的)。 – pbasdf

+0

是的,存在反向关系。 List对象映射到Media对象的contents属性是多对多类型。截至目前,从Media对象到List对象的反向关系是一对一的类型,但现在考虑一个Media对象可以存在于多个列表中,所以也许双方都应该是多对多的类型。 –

回答

1

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

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

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

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