我尝试执行以下操作:
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() 上崩溃了。
基本上,我尝试获取应用程序用户拥有的所有聊天 session ,并且我尝试确保所有 session 至少有 1 条消息。 另外,我想按最近的消息对所有 session 进行排序。
这是崩溃:
最佳答案
我认为您无法获得获取的结果 Controller 来实现您想要的。可以使谓词起作用:
predicate = NSPredicate(format: "user.userID = %@ AND messages.@count > 0", IOSUser.sharedInstance().userID)
但是排序描述符是一个失败的原因:CoreData 只能对(持久的)属性进行排序。一种解决方案是向 Session
实体添加持久属性(例如 lastMessageDate
)。显然,无论何时向 session 添加消息/从 session 删除消息,您都需要更新此属性。
如果您可以接受简单的获取,则可以使用谓词获取 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
)。
关于ios - NSPredicate 收集 NSManagedObject 请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37134398/