NSPredicate 收集 NSManagedObject 请求失败

NSPredicate on collection of an NSManagedObject fail to request

我尝试执行以下操作:

    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 条消息。 另外,我想按最近的消息对所有会话进行排序。

这是崩溃:

我认为您无法获得获取的结果控制器来实现您想要的。可以使谓词起作用:

predicate = NSPredicate(format: "user.userID = %@ AND messages.@count > 0", IOSUser.sharedInstance().userID)

但是排序描述符是一个失败的原因:CoreData 只能对(持久的)属性进行排序。一种解决方案是向 Session 实体添加持久属性(例如 lastMessageDate)。显然,每当 adding/deleting 消息 to/from 会话时,您都需要更新此属性。

如果您可以接受简单的获取,则可以使用谓词获取 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)。