2016-06-10 62 views
1

我的數據設計允許一個用戶進行多次投票;並且每個單獨的記錄也可以有很多票。我和引用和搜索依靠這些從一對多關係中搜索/檢索單個值核心數據Swift

enter image description here

在主視圖控制器的特定元素大量掙扎,我有一個在記錄實體,和一個變種用戶實體獲取控制器(即。設備用戶)插入到相同的managedContext中。

假設這沒關係,準備segue到詳細的視圖控制器時,我想傳入選中的記錄(沒問題);所有選票的數組(我認爲沒有問題,下面的代碼);和(這裏是棘手的部分)可選設備用戶對該記錄的投票(這是我的問題)。

let votesAsSet = record.votes 
controller.votes = votesAsSet?.allObjects as? [Vote] 

let predicateForUsersVote = NSPredicate(format: "record.votes.user == user") 
let thisUsersVoteForThisRecordAsSet = votesAsSet?.filteredSetUsingPredicate(predicateForUsersVote)     

controller.thisUsersVote = thisUsersVoteForThisRecordAsSet!.first as? Vote 

我想要做的是迭代核心數據中的用戶投票,其中記錄的用戶與設備用戶匹配。

回答

1

由於您的謂詞已經在record的集合Votes上運行,因此您可以直接使用user屬性。但是,你必須在裝置 - 用戶正確的值代替,例如:

let predicateForUsersVote = NSPredicate(format: "user == %@", device-user) 

應用該謂詞來設定也將是一個集的結果,所以我覺得你可能需要使用.anyObject()而非.first得到相關的Vote對象。

+0

我的上帝它的作品!我已經閱讀了很多關於謂詞,NSSets和核心數據的內容,並且您的答案很好地融合了它。一個補充問題,如果你有一個時刻:爲什麼不只是「用戶==用戶」或「用戶== self.user」,這兩者似乎工作? – DrWhat

+0

在一個謂詞中,'user'指被評估對象的'user'屬性** **:在這種情況下,這個集合中的每個'Vote'對象。同樣'self'指的是對象本身。因此,「user == user」和「user == self.user」將對象的user屬性與對象的user屬性進行比較,並且對於所有對象都將評估爲true - 不僅僅是設備-用戶。 – pbasdf

+0

如果您想與構建謂詞的代碼中的值進行比較,則必須使用%@格式替換該值。 – pbasdf