2017-04-03 18 views
0

祖父母、親子モデルの関係(Orchestraクラスモデルオブジェクト、多くはSectionを含み、それぞれには多くのPlayerが含まれています)があります。言い換えれば、Orchestraオブジェクトはvar allSections: [Section]と呼ばれる性質を持っており、Sectionオブジェクトがvar allPlayers: [Player]祖父母 - 親子データモデルの関係でNSCodingを適切に使用する

私の目標はNSCodingを使用して3つのモデルすべてのデータを永続化するためにあるというプロパティがあります。 私はNSCoding(A)すべての3クラス、(B)子クラスのみ、または(C)子クラス以外のすべてのクラスに準拠する必要があるかどうか混乱していますか?私の混乱の原因の1つは、[NSCodingが巻き込まれている] [1]という事実です。

これまでのところ、私はPlayerための標準NSCodingプロトコルのメソッド実装されています:

func encode(with aCoder: NSCoder) { 
     aCoder.encode(name, forKey: "playerName") 
     aCoder.encode(id, forKey: "playerId") 
     aCoder.encode(playerStatus, forKey: "playerStatus") 
     aCoder.encode(playerPosition, forKey: "playerPosition") 

    } 

    required init(coder aDecoder: NSCoder) { 

     name = aDecoder.decodeObject(forKey: "playerName") as! String 
     id = aDecoder.decodeObject(forKey: "playerId") as! String 
     playerStatus = aDecoder.decodeObject(forKey: "playerStatus") as! PlayerStatus 
     playerPosition = aDecoder.decodeObject(forKey: "playerPosition") as! PlayerPosition 

     super.init() 

    } 

そして、私が呼び出すSectionためinit方法で:

if let archivedItems = NSKeyedUnarchiver.unarchiveObject(withFile: itemArchivalURL.path) as? [Item] { 
      allPlayers = archivedItems 
     } 

答えて

1

場合は、すべての3はNSCodingに適合しなければならないがOrchestraのインスタンスをアーカイブしたいとします。

あなただけだけSectionPlayerNSCodingに適合しなければならないSectionインスタンスをアーカイブする場合。

このように考えてください。アーカイブするオブジェクトは、それ自体がNSCodingに準拠している必要があります。また、そのクラスでエンコード/デコードする必要があるものは、NSCodingに準拠している必要があります。最終的にはエンコード/デコードする必要のあるすべてのクラスで真実を保持する必要があります。

+0

参考になる説明です。 'allSections'が設定されているのに、' section'に属する 'allPlayers'プロパティは、保存してもデータが取り込まれないという問題に遭遇しました。問題を説明するコードを質問本体に追加しました。 – daspianist

+0

元の質問に答えました。私はあなたがこのオリジナルの質問を閉じることを提案し、あなたはあなたの新しい問題で新しい質問を投稿します。関連するすべてのコードを含め、エンコード/デコードの問題点を明確に説明してください。 – rmaddy

+0

入手しました。あなたの提案ごとにアンバンドルします。 – daspianist

関連する問題