2016-04-27 6 views
0
私はクラスを持っている

が、それは2つのプロパティがありますクラスが初期化されたら、私は応じてローカルDBからfruintsPackContentにデータを追加したい1つのプロパティが初期化され、dbから別のプロパティ、つまりベストプラクティスにデータをプルするための参照として使用するまで待ちますか?

  1. var fruitsPackId: Int
  2. var fruitsPackContent: Array<Fruit>?

fruitsPackIdで初期化されました。私はそのような場合にベストプラクティスが何であるか分かりません。

私が今行ったことは、参照IDとしてfruitsPackIdを使用してローカルデータベースからデータを取り出す計算プロパティとしてfruitsPackContentを作成しています。

しかし、これは正しいアイディアやアイデアではないと思いますか?

マイコード:

class FruitsPack: NSObject { 

    var fruitsPackId: Int 

    init(fruitsPackId: Int) { 
     self.fruitsPackId = fruitsPackId 
    } 

    var fruitsPackContent: Array<Fruit>? { 

     // Pulling data from local db here... 
     // For this example I create a dummy array with one instance of Fruit 
     let fruit1 = Fruit(fruitsPackId: self.fruitsPackId, fruitName: "Banana") 
     var fruits = Array<Fruit>() 
     fruits.append(fruit1) 

     return fruits 
    } 
} 

class Fruit: FruitsPack { 

    var fruitName: String 

    init(fruitsPackId: Int, fruitName: String) { 
     self.fruitName = fruitName 
     super.init(fruitsPackId: fruitsPackId) 
    } 
} 

EDIT:

怠惰な変数の型を使用して私のために仕事でした:

  • クラスの初期化は、そのプロパティとは何の関係もありませんが
  • プロパティが呼び出された後でのみメモリが使用されています
  • プロパティは、インスタンスメソッドが他

新しいコードによって使用されるために利用可能であるだけ

  • 一度データで埋められている:データベースからデータを取得

    class FruitsPack: NSObject { 
    
        var fruitsPackId: Int 
        lazy var fruitsPackContent: Array<Fruit>? = self.getFruitsPackContent(self.fruitsPackId) 
    
        init(fruitsPackId: Int) { 
         self.fruitsPackId = fruitsPackId 
        } 
    
        func getFruitsPackContent(fruitsPackId: Int) -> Array<Fruit>? { 
         // Pulling data from local db here... 
         // For this example I create a dummy array with one instance of Fruit 
         let fruit1 = Fruit(fruitsPackId: self.fruitsPackId, fruitName: "Banana") 
         var fruits = Array<Fruit>() 
         fruits.append(fruit1) 
    
         return fruits 
        } 
    } 
    
    class Fruit: FruitsPack { 
    
        var fruitName: String 
    
        init(fruitsPackId: Int, fruitName: String) { 
         self.fruitName = fruitName 
         super.init(fruitsPackId: fruitsPackId) 
        } 
    } 
    
  • 答えて

    0

    が相対的に計算され高価なプロセスなので、私は個人的に計算されたプロパティにその建物のファンではありません。

    for index in 0 ..< fruitPack.fruitsPackContent.count { 
        print(fruitPack.fruitsPackContent[index]) 
    } 
    

    データベースにn個アイテムを持っていた場合、このコードが繰り返しデータベースからすべての項目の完全なリストを取得する可能性があるのn + 1:あなたは無邪気以下でしたいくつかのコードを持っていた場合はどう(countの場合は1回、添え字付きアクセスの場合は1回)。理論的には、計算されたプロパティが結果をキャッシュしていることを確認することでこれを修正できます(データベースがいつ更新されたかを特定し、キャッシュを無効にするコードを作成する必要があります)。

    データベースからの検索を明示的な方法にすると、データベースからデータを取得するタイミングとキャッシュされた配列にアクセスするタイミングをアプリの開発者が知ることができます。一般的に、いくつかの不動産に無邪気にアクセスした結果、隠されたパフォーマンスの影響を避けたいとします。

    +0

    私は主な方向を得ていますが、fruitsPackContentは空の状態ですので、fruitsPackContentにオブジェクトを追加するまでカウントはゼロになります。 FruitsPackクラスが開始されるとすぐにdbからデータを取得する必要がある場合、論理的にOOPの考え方、コードの正しい場所はどこですか? –

    +0

    最初に呼び出したとき、 'count'はゼロですが、それが非ゼロのときはどうなりますか?私の主張は、計算上高価なアクションを実行する計算プロパティを実際には望まないということです。クラスがインスタンス化されるとすぐに、データベースからデータを引き出します。データが小さく、メモリに簡単に保持されるため、それを行うには理論的に 'init'で行いますが、格納されたプロパティを使用してそのプロパティを参照するたびにすべてのデータを再フェッチする計算済みプロパティではなく、データを保持します。 – Rob

    +0

    私はそれにオブジェクトを追加しなかった限りゼロになります。私は、計算されたプロパティ内のDBからデータを追加することは費用がかかり、格納されたプロパティ内のデータをよりスマートに保存することに同意します。しかし、initの間にそれを行うことはできません。私はクラスの子をその配列の中に格納しているので、initの間にそれをやっていれば、親initが終了する前に子initが終了しようとするので失敗します。残念ながら、私はそれをより良くする方法の答えはありません。とにかく助けてくれてありがとう! –

    関連する問題