gpt4 book ai didi

swift - 如何重新排序 Realm LinkingObjects 中的元素?

转载 作者:行者123 更新时间:2023-11-28 11:30:14 24 4
gpt4 key购买 nike

我有一个 Item 数据类,每个 Item 都有一个父项和许多子项,它们是来自父属性的 LinkingObjects。简化版:

@objcMembers class Item: Object {
dynamic var title: String = ""
dynamic var parent: Item?
let children = LinkingObjects(fromType: Item.self, property: "parent")
}

我需要能够对子项重新排序,并保留该更改。似乎因为 LinkingObjects 是一种容器类型,所以这是不可能的?在这种情况下,您会建议我如何处理这个问题——我应该更改 children 吗?正常List<Item>并且每次都以两种方式手动更新 Realm ?有更好的解决方案吗?

最佳答案

The order in which the children appear matters, because users will want to choose their own ordering based on which items they want to see first.

这里的重要部分是您要控制“子项出现的顺序”。如果您能够识别数据“模型”和数据“ View ”之间的区别,那么您就可以找出答案。请记住,Realm 模型表示不在您的控制之下,您也不需要它。它如何存储在 Realm 数据库中不是你的问题。

实际上,当您请求 LinkingObjects 字段的结果时,它可能是数据库查询的结果,而不是直接从表中提取的结果。因此,字段中对象的顺序可能不一致,或者添加更多链接对象可能会导致额外的项目出现在结果中的任何位置。

正如您所说,重要的是 child 出现的顺序。这可以通过查询来控制。 LinkingObjects 类型允许您直接查询,即您可以调用:

item.children.sorted(byKeyPath: "title")

一个建议是为您的模型类型添加一个扩展来为您处理排序,为您需要的每种排序类型提供一个访问器,例如:

extension Item
{
var childrenSortedByTitle: Results<Item>
{
return children.sorted(byKeyPath: "title")
}
}

或者您可以使用 ascending bool 参数使该函数在查询中使用。或者您可以添加第二个升序/降序查询。您还可以为您希望作为排序依据的每个其他参数添加额外的查询。或者您可以定义排序字段的枚举并将其作为参数传递。无论哪种方法最适合您。但绝对值得将查询详细信息隐藏在类扩展本身(恕我直言)中。

关于swift - 如何重新排序 Realm LinkingObjects 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com