NSPredicate和NSSortDescriptor有很多关系

时间:2015-01-11 21:07:07

标签: ios swift core-data nspredicate nssortdescriptor

我有这样的架构: `

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。 所以: 我需要在User表中进行提取,以接收有一个或多个已接收或发送消息的用户。 我这样做:

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

1 个答案:

答案 0 :(得分:-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,并按照该属性对它们进行排序,它会简化你的代码。