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

时间:2019-01-15 17:45:38

标签: ios core-data nsfetchedresultscontroller

我有一个看起来像这样的数据模型:

https://stackblitz.com/edit/angular-ih2drk?file=src%2Fapp%2Fapp.component.ts

如您所见,存在多对多关系。在我的主视图控制器中,我像这样提取所有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 个答案:

答案 0 :(得分:1)

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

您还说过“ ...为每个获取的标签执行其帖子的附加获取”。您永远不应该获取标签的帖子或帖子的标签,而总是使用关系。这些关系要快几个数量级。