我正在构建一个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可以存储在实体中的其他可用类型。关于如何做到这一点的例子将不胜感激。
答案 0 :(得分:1)
核心数据有点尴尬。我想我要做的是:
connect
的新实体。它有一个属性,一个名为TrieNodeLink
的字符串和一个名为childString
node
的关系。该实体的每个实例代表一个特里节点的一个子节点。TrieNode
添加新的多对多关系到新的TrieNode
实体。TrieNodeLink
字典。在方便的时候,通过扫描第2步中的新对多关系来初始化此字典。方便的时间可能在child
,否则您可以使其成为Swift awakeFromFetch
属性。或者,如果您想以更高的内存使用成本预加载数据以获得更快的性能,您可能会编写一些代码,以便在需要之前递归加载几个级别的子节点。这样做的结果是,您需要时根据需要加载部分trie。加载后,您就可以使用lazy
字典快速查找子节点。