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

How to sort my NSFetchedResultsController with an entity's related ordered set?

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

如您所见,存在多对多关系。在我的主视图控制器中,我正在获取所有 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)")
    }

我希望标签显示为 post 的标签最先显示最新的时间戳。由于 posts 是一个有序集,我想也许如果我能在有序集的时间戳中获得第一个 post 并对其标签进行排序,那将可行。但是 NSSortDescriptor 关键语言似乎不接受 "self.posts.first" 之类的东西。

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

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

您还说“...对于每个获取的标签执行其 posts 的额外获取”。您永远不应该获取标签的 post 或 post 的标签,但始终使用关系。关系快了几个数量级。