如何在NSManageBjects iOS上进行嵌套排序



有人知道如何使用nssortDescriptors做嵌套的排序(不确定这是最好的术语)?

我正在使用nssortDescriptor来获取nsmanagedObject。

我有一个名为"对话"的nsmanagebject,它与消息有一对一的关系。每次对话都有一定的消息。

每条消息都有一个时间到期日期属性。我试图通过各自的最新消息的时间来对话

重述:我正在尝试通过每个对话中的最后一次时间来查找消息,然后通过各自的最新消息对对话进行分类。消息和对话是nsmanagedObject。

这些描述符的关键字符串性质使我真的很难找出。

我在上面看到了一些东西,所以建议这样的东西:nssortDescriptor * sortbyDate = [nssortDescriptor sortdescriptorwithkey:@messages。

但我只是崩溃:

 *** 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中。然后告诉您提取的结果控制器对此进行排序。

最新更新