ios - NSPredicate 收集 NSManagedObject 请求失败

标签 ios objective-c core-data nspredicate

我尝试执行以下操作:

    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 进行排序。

这是崩溃:

enter image description here

最佳答案

我认为您无法获得获取的结果 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/

相关文章:

objective-c - IOS - 动画没有响应

ios - 从 IOS 上安装的应用程序中删除旧的未使用的 .mom(d) 文件?

ios - 在 SKSpriteNode 中暂停一项操作,同时运行另一项操作

ios - 由于权限问题,运行 pod install 进行更新时出错

ios - UIButton 和外观 API - 支持与否?

iphone - TableView 警报不显示

ios - 如何测试 SKNode 子类中的 SK 物理接触?

objective-c - 为什么 alloc 和 init 在 Objective-C 中分开调用?

ios - 我应该使用什么数据类型在 Core Data 中存储 GUID?

cocoa - 如何从 NSEntityDescription 中获取实体