如何使用实体的相关有序集对我的 NSFetchedResultsController 进行排序?

Posted

技术标签:

【中文标题】如何使用实体的相关有序集对我的 NSFetchedResultsController 进行排序?【英文标题】:How to sort my NSFetchedResultsController with an entity's related ordered set? 【发布时间】:2019-01-15 17:45:37 【问题描述】:

我有一个如下所示的数据模型:

如您所见,存在多对多关系。在我的主视图控制器中,我正在获取所有 Tag 对象,如下所示:

    let tagFetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "Tag")
    //3
    tagFetchRequest.predicate = NSPredicate(format: "self.posts.@count != 0")

    //let sort = NSSortDescriptor(key: "posts.first?.timestamp", ascending: false). This line is the issue
    tagFetchRequest.sortDescriptors = [sort]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: tagFetchRequest, managedObjectContext: managedContext, sectionNameKeyPath: nil, cacheName: nil) as? NSFetchedResultsController<Tag>
    fetchedResultsController.delegate = self

    do 
        try fetchedResultsController.performFetch()
     catch let error as NSError 
        print("Could not fetch. \(error), \(error.userInfo)")
    

我希望标签显示,以便谁的帖子的标签具有最新的时间戳首先显示。由于帖子是一个有序集,我想也许我可以在有序集的时间戳中获得第一个帖子并对其标签进行排序,那将起作用。但似乎 NSSortDescriptor 键语言不接受“self.posts.first”之类的东西。

另一种选择是 - 对于每个提取的标签执行额外的帖子提取,然后以编程方式对它们进行排序,并以某种方式返回这个排序后的最新时间戳的值并将其提供给 NSFetchedResultsController。我不知道你是否可以这样做 - 你会在哪里执行这个额外的提取?你能把这样的东西传递给NSSortDescriptor吗?

【问题讨论】:

【参考方案1】:

您应该对数据进行非规范化。在Tag 中为dateLastUsed 添加一个字段并按此排序。标记帖子时更新它。根据您的产品要求,您可能还必须在从帖子中删除标签时对其进行更新。在这种情况下,您必须查看所有标签的帖子并分配最新帖子的dateLastUsed

您还说过“...为每个提取的标签执行额外的帖子提取”。您永远不应该获取标签的帖子或帖子的标签,但始终使用这种关系。关系要快几个数量级。

【讨论】:

以上是关于如何使用实体的相关有序集对我的 NSFetchedResultsController 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 sortDescriptor 用于一对多关系的属性

我应该如何对我的核心数据实体中的 NSNumber 属性执行计算/更新?

如何使用非常小的数据集对特征进行加权以获得更好的聚类?

EF Core 如何实现对值对象更改的审计日志

如何使用实体框架将相关实体添加到数据库

使用同一个表中的并集对结果进行排序