2016-07-24 40 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

我想我只是描述了一種方法。你不能保存字典,所以你需要轉換爲/可以保存在覈心數據中的東西。這是一個計劃;有可能是其他人。 –

相關問題