使用Swift在iOS中使用27000个节点保留trie数据树的方法是什么?
我正在构建一个Trie树,下面有大约27000个节点。 我希望坚持下去,而不是每次在应用程序启动时重新创建它。 因为子属性是另一个节点的字典,所以我无法使用NSCoding
将其存档并存储在核心数据实体中。 有没有办法将此节点存储在Core Data中? 或者我应该使用不同类型的持久性?
class TrieNode { var letter:Character var fullWord:Bool var leadingLetters:String var child = [Character:TrieNode]() init (letter:Character, leadingLetters:String, fullWord:Bool) { self.letter = letter self.fullWord = fullWord self.leadingLetters = leadingLetters } }
我尝试使用Core Data时遇到的主要问题是如何将var child = [Character:TrieNode]()
转换为NSData或CD可以存储在实体中的另一种可用类型。 关于如何做到这一点的例子将不胜感激。
核心数据有点尴尬。 我想我要做的是:
- 创建一个名为
TrieNodeLink
的新实体。 它有一个属性,一个名为childString
的字符串和一个名为TrieNode
类型的node
的关系。 该实体的每个实例代表特里节点的一个单个子节点。 - 从现有
TrieNode
添加新的to-many关系到新的TrieNodeLink
实体。 - 保留现有的
child
字典。 在方便的时候,通过扫描步骤2中的新的to-many关系来初始化这个字典。一个方便的时间可能在awakeFromFetch
,否则你可以使它成为一个Swiftlazy
属性。 或者,如果您希望以更高的内存使用成本预加载数据以获得更快的性能,您可以编写一些代码,以便在需要之前递归加载几个级别的子节点。
这样做的结果是,您需要时根据需要加载部分trie。 加载后,您就可以使用child
字典快速查找子节点。