2016-05-10 28 views
1

我儘量做到以下幾點:NSPredicate上NSManagedObject的集合不能要求

predicate = NSPredicate(format: "user.userID = %@ AND messages[SIZE] > 0", IOSUser.sharedInstance().userID) 
    let managedObjectCtx = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
    let entity = NSEntityDescription.entityForName("Session", inManagedObjectContext: managedObjectCtx) 
    fetchRequest.entity = entity 
    fetchRequest.predicate = predicate 
    let dateSortDescriptor = NSSortDescriptor(key: "messages[LAST].date", ascending: false) 
    let sortDescriptors = [dateSortDescriptor] 
    fetchRequest.sortDescriptors = sortDescriptors 
    sessionFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectCtx, sectionNameKeyPath: nil, cacheName: nil) 
    sessionFetchedResultsController.delegate = self 

do{ 
    try sessionFetchedResultsController.performFetch() 
}catch{ 
    abort() 
} 

但它崩潰的performFetch()。

基本上我嘗試獲取應用程序用戶擁有的所有聊天會話,並嘗試確保所有會話都至少有1條消息。 另外,我想按最近的消息對所有會話進行排序。

這裏是崩潰:

enter image description here

+0

我嘗試添加fetchRequest.includesSubentities =真 但它仍然無法 – Mikael

+0

我也試圖與關鍵字「Any」而任何消息[SIZE]> 0" – Mikael

+0

你確定謂語的問題 - 我懷疑它可能是排序描述符,沒有謂詞測試,然後沒有排序描述符,並查看是哪個原因導致問題(或可能兩個!)。 – pbasdf

回答

1

我不認爲你將能夠獲得一個讀取的結果控制器來實現你想要什麼。謂詞可以進行工作:

predicate = NSPredicate(format: "user.userID = %@ AND [email protected] > 0", IOSUser.sharedInstance().userID) 

但排序描述符是一個失敗的事業:CoreData只能排序上(持久)屬性。一種解決方案是向Session實體添加持久屬性(例如,lastMessageDate)。無論何時向/從會話添加/刪除消息,您顯然都需要更新此屬性。

如果你可以用一個簡單的活回來,你可以用一個謂語取Message對象:

predicate = NSPredicate(format: "session.user.userID = %@", IOSUser.sharedInstance().userID) 

和排序描述:

let dateSortDescriptor = NSSortDescriptor(key: "date", ascending: false) 

,然後使用提取不同Session對象的數組

let sessionsArray = fetchResults.valueForKeyPath("@distinctUnionOfObjects.session") 

(您可能需要投fetchResults作爲NSArray)。

+0

讓我嘗試使用獨特的方法來獲取消息。我也在考慮獲取屬性。難道你不認爲有可能在會話中創建一個獲取最後的消息嗎? – Mikael

+0

你有想法嗎?爲什麼「AND消息[SIZE]> 0」會導致讀取崩潰? – Mikael

+0

「AND messages。@ count!= 0」似乎正在工作,雖然...文檔不正確?!?! – Mikael