Как сохранить дерево данных с 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 немного неловко. Я думаю, что я бы сделал, это:

  1. Создайте новый объект под названием что-то вроде TrieNodeLink, У него есть одно свойство, строка называется что-то вроде childString и одно отношение, называемое node типа TrieNode, Каждый экземпляр этого объекта представляет собой один единственный подузел временного узла.
  2. Добавьте новое отношение ко многим из существующих TrieNode к новому TrieNodeLink юридическое лицо.
  3. Оставьте свой существующий child толковый словарь. В удобное время инициализируйте этот словарь, отсканировав новое отношение ко многим из шага 2. Удобное время может быть в awakeFromFetchили вы могли бы сделать это Swift lazy имущество. Или, если вы хотите предварительно загрузить данные для повышения производительности за счет более высокого использования памяти, вы можете написать некоторый код для рекурсивной загрузки дочерних узлов на несколько уровней до того, как они понадобятся.

В результате вы будете загружать части дерева по требованию, когда это необходимо. После загрузки вы сможете использовать свой child словарь для быстрого поиска дочерних узлов.

Другие вопросы по тегам