Как сохранить дерево данных с 27000 узлами в iOS с помощью Swift?
Я строю дерево 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 ответ
В Core Data немного неловко. Я думаю, что я бы сделал, это:
- Создайте новый объект под названием что-то вроде
TrieNodeLink
, У него есть одно свойство, строка называется что-то вродеchildString
и одно отношение, называемоеnode
типаTrieNode
, Каждый экземпляр этого объекта представляет собой один единственный подузел временного узла. - Добавьте новое отношение ко многим из существующих
TrieNode
к новомуTrieNodeLink
юридическое лицо. - Оставьте свой существующий
child
толковый словарь. В удобное время инициализируйте этот словарь, отсканировав новое отношение ко многим из шага 2. Удобное время может быть вawakeFromFetch
или вы могли бы сделать это Swiftlazy
имущество. Или, если вы хотите предварительно загрузить данные для повышения производительности за счет более высокого использования памяти, вы можете написать некоторый код для рекурсивной загрузки дочерних узлов на несколько уровней до того, как они понадобятся.
В результате вы будете загружать части дерева по требованию, когда это необходимо. После загрузки вы сможете использовать свой child
словарь для быстрого поиска дочерних узлов.