2015-01-11 4 views
0

У меня есть схема так: `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") И потом, мне нужно отсортировать его в том, что у меня есть пользователи с уже говорили недавно на верхней части представления таблицы (отправить или полученные сообщения) Должен ли я использовать возможно, мин? Спасибо за ответ, я ценю это

ответ

-1

Вы попробовать что-то вроде:

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

fetchRequest.sortDescriptors = [sortSend, sortReceived] 

[EDIT] Мой плохо, это не представляется возможным непосредственно, поскольку это отношения, так что вам придется фильтровать его потом, с чем-то вроде:

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 на вашем пользователе и отсортировать их по этому свойству, это значительно упростит ваш код.

+0

Это не будет работать, так как 'sendMessages' и' receivedMessages' являются наборами (которые представляют собой отношения many-many), а не один экземпляр 'Message'. –

Смежные вопросы