2017-02-24 97 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(每個都具有多個反轉)。