使用 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
的字符串和一个名为node
的TrieNode
类型的关系。该实体的每个实例都代表 trie 节点的一个子节点。
从现有的TrieNode
向新的TrieNodeLink
实体添加新的多对多关系。
保留现有的child
字典。在方便的时候,通过扫描来自步骤 2 的新的多对多关系来初始化这个字典。方便的时候可能是在awakeFromFetch
,或者你可以把它变成一个 Swift 的lazy
属性。或者,如果您想以更高的内存使用为代价预加载数据以获得更快的性能,您可以编写一些代码以在需要之前将子节点递归加载几级。
这样做的效果是您可以在需要时按需加载部分 trie。加载后,您就可以使用 child
字典快速查找子节点。
【讨论】:
谢谢汤姆。我的主要问题是试图将子字典变成核心数据喜欢的东西——你对如何做到这一点有什么建议吗? 我想我只是描述了一种方法。您无法保存字典,因此您需要转换为可以保存在 Core Data 中的内容。这是一个方案;可能还有其他人。以上是关于使用 Swift 在 iOS 中持久化具有 27000 个节点的 trie 数据树的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以仅使用密码进行身份验证,即使设备在 ios 中具有 touch id 功能,swift
在swift ios中再次运行应用程序后核心数据显示故障记录?