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,并按该属性对其进行排序,这将大大简化您的代码。
【讨论】:
这不起作用,因为sendMessages
和 receivedMessages
是集合(代表一对多关系),而不是 Message
的单个实例。以上是关于NSPredicate NSSortDescriptor 与多关系的主要内容,如果未能解决你的问题,请参考以下文章