2016-07-24 37 views
1

我正在构建一个Trie树,它将具有大约27000个节点。我不想每次在应用程序启动时重新创建它,我都想坚持下去。由于子属性是另一个节点的字典,因此我无法使用NSCoding将其归档并存储在核心数据实体中。有没有办法将这个节点存储在Core Data中?或者我应该使用不同类型的持久性?使用Swift在iOS中保持27000个节点的trie数据树的方法是什么?

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 
    } 
}  

主要的问题我在尝试使用核心数据是如何var child = [Character:TrieNode]()转换为NSData的或CD可以在实体存储其他可用的类型。如何做到这一点的例子,将不胜感激。

+0

你不想将它存储为'NSData'。只需为'TrieNode'创建数据模型并为其创建一个'NSManagedObject'。 –

+0

然后我如何存储儿童财产?它不会让我编译'[Character:TrieNode]()'作为'NSManagedObject'。 – Edan

+0

请仅查看Core Data。如果你自己付出一些努力,我们会很感激。本网站不是为了教育您使用它,而是为了帮助您解决特定问题。 –

回答

1

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

  1. 创建一个名为类似于TrieNodeLink的新实体。它有一个属性,一个名为childString的字符串和一个关系,名称为node,类型为TrieNode。此实体的每个实例都表示一个trie节点的单个子节点。
  2. 从您现有的TrieNode到新的TrieNodeLink实体添加新的一对多关系。
  3. 保留您现有的child字典。在方便的时候,通过扫描步骤2中的新一对多关系来初始化该字典。方便的时间可能在awakeFromFetch,否则您可以使其成为Swift lazy属性。或者,如果您想以更高的内存使用为代价来预加载数据以获得更快的性能,那么您可能会编写一些代码,以便在需要之前递归地将子节点加载几个级别。

这样做的效果是,您可以在需要时按需加载部分特里结构。一旦加载,您就可以使用child字典快速查找子节点。

+0

谢谢汤姆。我的主要问题是试图将儿童字典变成核心数据喜欢的东西 - 你有什么建议如何做到这一点? – Edan

+0

我想我只是描述了一种方法。你不能保存字典,所以你需要转换为/可以保存在核心数据中的东西。这是一个计划;有可能是其他人。 –

相关问题