NSPredicate NSSortDescriptor 与多关系

Posted

技术标签:

【中文标题】NSPredicate NSSortDescriptor 与多关系【英文标题】:NSPredicate&NSSortDescriptor with to many relationship 【发布时间】:2015-01-11 21:07:06 【问题描述】:

我有这样的架构: `

class Message: NSManagedObject 

    @NSManaged var content: String
    @NSManaged var id: NSNumber
    @NSManaged var sendDate: NSDate
    @NSManaged var sender: User
    @NSManaged var receiver: User



class User: NSManagedObject 

    @NSManaged var login: String
    @NSManaged var id: NSNumber
    @NSManaged var sendMessages: NSSet
    @NSManaged var receivedMessages: NSSet


我需要一些有关 NSPredicate 和 NSSortDescriptor 的帮助。我确信这很容易,但我正处于学习 Core Data Stuff 的开始阶段。 所以: 我需要在用户表中进行获取,以接收具有一个或多个接收或发送消息的用户。 我就是这样做的:

let fetchRequest = NSFetchRequest(entityName: "User") fetchRequest.predicate = NSPredicate(format: "sendMessages.count > 0 OR receivedMessages.count > 0") 然后,我需要按照用户最近在表格视图顶部交谈的方式对其进行排序(发送或接收消息) 我应该使用 min 函数吗? 谢谢你的回答,我很感激

【问题讨论】:

【参考方案1】:

你有没有尝试过类似的东西:

let sortSend = NSSortDescriptor(keyPath:"sendMessages.sendDate", ascending: false)
let sortReceived = NSSortDescriptor(keyPath:"receivedMessages.sendDate", ascending: false)

fetchRequest.sortDescriptors = [sortSend, sortReceived]

[编辑] 我的错,这是不可能的,因为它是关系,所以你必须在之后过滤它,比如:

let sortSend = NSSortDescriptor(keyPath:"sendDate", ascending: false)
let sortReceived = NSSortDescriptor(keyPath:"sendDate", ascending: false)

var result = []// result of request, array
var sendMessages = result.valueForKeyPath("@distinctUnionOfSets.sendMessages")
var receivedMessages = result.valueForKeyPath("@distinctUnionOfSets.receivedMessages")

var messages = sendMessages.setByAddingObjectsFromSet(receivedMessages)

messages = [messages sortedArrayUsingDescriptors:[sortSend, sortReceived]]

您的消息将被排序,您可以从中取回用户。

似乎太复杂了。 您可以做的是在您的用户上保留一个 lastMessageDate,并按该属性对其进行排序,这将大大简化您的代码。

【讨论】:

这不起作用,因为 sendMessagesreceivedMessages 是集合(代表一对多关系),而不是 Message 的单个实例。

以上是关于NSPredicate NSSortDescriptor 与多关系的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate

NSPredicate 谓词

子查询中的 NSPredicate

NSPredicate 问题

NSPredicate 字符串

NSPredicate == 查询