使用 Swift 在 iOS 中持久化具有 27000 个节点的 trie 数据树的方法是啥?

Posted

技术标签:

【中文标题】使用 Swift 在 iOS 中持久化具有 27000 个节点的 trie 数据树的方法是啥?【英文标题】:What is the way to persist a trie data tree with 27000 nodes in iOS using Swift?使用 Swift 在 iOS 中持久化具有 27000 个节点的 trie 数据树的方法是什么? 【发布时间】:2016-07-24 14:57:59 【问题描述】:

我正在构建一个 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 可以存储在实体中的其他可用类型。我们将不胜感激有关如何做到这一点的示例。

【问题讨论】:

您不想将其存储为NSData。只需为 TrieNode 创建数据模型并为其创建一个 NSManagedObject 然后如何存储子属性?它不会让我将[Character:TrieNode]() 编译为NSManagedObject 请查看核心数据。如果您自己付出一些努力,我们将不胜感激。这个网站不是为了教你如何使用它,而是为了帮助你解决具体的问题。 本网站旨在提供帮助和指导@GuidoHendriks - 如果您不知道答案,欢迎您尝试提供帮助。我向您提出了一个具体问题 - 我找不到将[Character:TrieNode]() 存储为NSManagedObject 的方法,这就是导致首要问题的原因。你愿意进一步澄清你的建议吗?谢谢。 这只是基本的一对多关系? 【参考方案1】:

在 Core Data 中有点尴尬。我想我会做的是:

    创建一个名为TrieNodeLink 之类的新实体。它有一个属性,一个名为childString 的字符串和一个名为nodeTrieNode 类型的关系。该实体的每个实例都代表 trie 节点的一个子节点。 从现有的TrieNode 向新的TrieNodeLink 实体添加新的多对多关系。 保留现有的child 字典。在方便的时候,通过扫描来自步骤 2 的新的多对多关系来初始化这个字典。方便的时候可能是在awakeFromFetch,或者你可以把它变成一个 Swift 的lazy 属性。或者,如果您想以更高的内存使用为代价预加载数据以获得更快的性能,您可以编写一些代码以在需要之前将子节点递归加载几级。

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

【讨论】:

谢谢汤姆。我的主要问题是试图将子字典变成核心数据喜欢的东西——你对如何做到这一点有什么建议吗? 我想我只是描述了一种方法。您无法保存字典,因此您需要转换为可以保存在 Core Data 中的内容。这是一个方案;可能还有其他人。

以上是关于使用 Swift 在 iOS 中持久化具有 27000 个节点的 trie 数据树的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以仅使用密码进行身份验证,即使设备在 ios 中具有 touch id 功能,swift

在swift ios中再次运行应用程序后核心数据显示故障记录?

swift ios数据持久化UIImage

使用Swift 2编程从持久ID中查找歌曲

Swift - iOS 9:如何在 iOS 9 中呈现具有自定义大小的 UIViewController? [复制]

如何在 iOS/Swift 2 上使用 PHPhotoLibrary 保存具有自定义文件名的照片?