使用Swift在iOS中使用27000个节点保留trie数据树的方法是什么?

时间:2016-07-24 14:57:59

标签: ios swift core-data persistence 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可以存储在实体中的其他可用类型。关于如何做到这一点的例子将不胜感激。

1 个答案:

答案 0 :(得分:1)

核心数据有点尴尬。我想我要做的是:

  1. 创建一个名为connect的新实体。它有一个属性,一个名为TrieNodeLink的字符串和一个名为childString node的关系。该实体的每个实例代表一个特里节点的一个子节点。
  2. 从现有的TrieNode添加新的多对多关系到新的TrieNode实体。
  3. 保留现有的TrieNodeLink字典。在方便的时候,通过扫描第2步中的新对多关系来初始化此字典。方便的时间可能在child,否则您可以使其成为Swift awakeFromFetch属性。或者,如果您想以更高的内存使用成本预加载数据以获得更快的性能,您可能会编写一些代码,以便在需要之前递归加载几个级别的子节点。
  4. 这样做的结果是,您需要时根据需要加载部分trie。加载后,您就可以使用lazy字典快速查找子节点。