代码之家  ›  专栏  ›  技术社区  ›  BigBoy1337

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

  •  0
  • BigBoy1337  · 技术社区  · 6 年前

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

    enter image description here

    正如你所看到的,这是一种多对多的关系。在我的主视图控制器中,我正在获取所有标记对象,如下所示:

        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 s是一个有序集,我想如果我能得到有序集的时间戳中的第一个post并对其上的标记进行排序,那就行了。但nssortdescriptor密钥语言似乎并不接受“self.posts.first”这样的东西。

    另一个选项是-对于每个获取的标记执行其post的额外获取,然后以编程方式对这些进行排序,并以某种方式返回此排序的最新时间戳的值,并将其交给nsfetchedresultscontroller。我不知道你是否能做到这一点-你会在哪里执行这个额外的获取甚至?你能把这样的东西传给nssortdescriptor吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jon Rose    6 年前

    您应该取消数据的规格化。在中添加字段 Tag 对于 dateLastUsed 按这个分类。当帖子被标记时更新它。根据您的产品要求,当从帖子中删除标记时,您可能还必须更新它。在这种情况下,您必须查看标签的所有贴子并指定 上次使用日期 最新的帖子。

    你还说“……对于每个获取的标记,对其post“”执行额外的获取。您不应该获取标记的帖子或帖子的标签,而应该始终使用关系。这种关系是数量级的更快。