ios - 如何在 NSManagedObject iOS 上进行嵌套排序

标签 ios xcode core-data nsmanagedobject nssortdescriptor

有谁知道如何使用 NSSortDescriptors 进行嵌套排序(不确定这是否是最好的术语)?

我正在使用 NSSortDescriptors 来获取 NSManagedObjects。

我有一个名为 Conversation 的 NSManagedObject,它与消息具有一对多关系。每个对话都有一个 NSSet 消息。

每条消息都有一个 timeReceived Date 属性。我正在尝试按各自最新消息的接收时间对我的对话进行排序

重申一下:我正在尝试在每个对话中找到最后一次接收到的消息,然后根据各自的最新消息对对话进行排序。消息和对话是 NSManagedObjects。

这些描述符的关键字符串性质让我真的很难理解。

我在 SO 上看到了类似这样的内容: NSSortDescriptor * sortByDate = [NSSortDescriptor sortDescriptorWithKey:@"messages.@min.timeReceived"ascending:NO];

但我只是崩溃了:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Keypath containing KVC aggregate where there shouldn't be one; failed to handle messages.@max.timeReceived'

你们有没有人做过这样的事情?

- (NSFetchedResultsController *) fetchSortedConversations
{
    NSSortDescriptor *sortByDate = [NSSortDescriptor sortDescriptorWithKey:@"latestMessage.timeReceived" ascending:NO];

    // I implemented a workaround where I set a latestMessage for each Conversation somewhere else, but I'd like to be able to sort the Conversations without having to manually manage the latest message.

    NSArray * sortDescriptors = @[sortByDate];

    NSFetchedResultsController * conversations = [self.coreDataManager fetchEntitiesWithName: NSStringFromClass([Conversation class]) sortDescriptors:sortDescriptors sectionNameKeyPath:nil predicate:nil];


    return conversations;
}

最佳答案

我假设您面临的问题不能用当前制定的 NSFetchedResultsController 来解决,因为它不能真正用 SQL 巧妙地解决。所以 NSFetchRequest 可能只是拒绝这样做,然后向上冒泡。

最简单的解决方案是在您为Conversation 获得的托管对象子类上实现- willSave 并在其中找到@max.timeReceived 并将其直接存储到 Conversation 中的属性。然后告诉您的获取结果 Controller 对其进行排序。

关于ios - 如何在 NSManagedObject iOS 上进行嵌套排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21394679/

相关文章:

ios - 新 iPad 的高分辨率/视网膜显示应用程序图标文件名

ios - 在cocos2d v3中预加载图像

Xcode:如何清理所有项目,而不仅仅是 1 个项目?

objective-c - 为什么苹果使用 NSOrderedSet 而不是 NSArray 来处理 CoreData 中的有序多值关系?

ios - Xcode Core-Data 数据模型检查器中的索引是什么

ios - OpenGL ES 2.0 : How to improve frame rate of drawing sprites?

iphone - 如何在 iOS 中更改 GPS 更新时间

ios - 如何让 iTunes Connect 识别新的 Bundle ID

iphone - 使用 Core Data 中的 id 获取

ios - 快速从核心数据中获取会导致崩溃,因为我收到了其他类型的对象