如何使用实体的相关有序集对我的 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 的标签,但始终使用关系。关系快了几个数量级。
我有一个如下所示的数据模型:
如您所见,存在多对多关系。在我的主视图控制器中,我正在获取所有 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 的标签,但始终使用关系。关系快了几个数量级。