Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSManagedObject集合上的NSPredicate请求失败_Ios_Objective C_Core Data_Nspredicate - Fatal编程技术网

Ios NSManagedObject集合上的NSPredicate请求失败

Ios NSManagedObject集合上的NSPredicate请求失败,ios,objective-c,core-data,nspredicate,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

我试着做到以下几点:

    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()上崩溃

基本上,我尝试获取应用程序用户拥有的所有聊天会话,并尝试确保所有会话至少包含一条消息。 另外,我想按最近的消息对所有会话进行排序

以下是坠机事件:


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

predicate = NSPredicate(format: "user.userID = %@ AND messages.@count > 0", IOSUser.sharedInstance().userID)
但是排序描述符是一个失败的原因:CoreData只能对(持久)属性进行排序。一种解决方案是向
会话
实体添加持久属性(例如
lastMessageDate
)。在会话中添加/删除消息时,显然需要更新此属性

如果您可以使用普通获取,那么您可以使用谓词获取
Message
对象:

predicate = NSPredicate(format: "session.user.userID = %@", IOSUser.sharedInstance().userID)
和排序描述符:

let dateSortDescriptor = NSSortDescriptor(key: "date", ascending: false)
然后使用

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

(您可能需要将
fetchResults
转换为
NSArray
)。

我尝试添加fetchRequest.includesSubentities=true,但仍然失败。我还尝试了使用关键字“ANY”和任意消息[SIZE]>0“您确定谓词是问题所在吗?我怀疑它可能是排序描述符。在没有谓词的情况下进行测试,然后在没有排序描述符的情况下进行测试,看看是什么导致了这个问题(或者可能是两者都有!)。显然两者都有,但我真的不知道为什么。。。我需要测试消息是否也不是nil吗?让我用distinct方法尝试获取消息。我也在考虑获取属性。您不认为可以在检索最后一条消息的会话中创建一条消息吗?您知道为什么“和消息[SIZE]>0”也会导致提取崩溃吗?还有消息。@count!=0”似乎也在工作。。。医生说的不对@Mikael这些文档非常精简,没有给出支持各种功能的平台(iOS/OSX)、版本、存储类型(sqlite v内存)等的完整信息。恐怕我不认为fetch属性会产生更好的解决方案。我最终在会话中添加了lastMessageDate属性,并使用了消息。@count检查keypath是否为空。。。我不明白为什么他们会说:在关键字路径的谓词中使用array[SIZE]。。。它只是崩溃了。。。