等待一个属性初始化并将其用作将数据从db拉入另一个属性的参考,最佳做法是什么?

时间:2016-04-27 23:03:10

标签: swift inheritance

我有一个类,它有两个属性:

  1. var fruitsPackId: Int
  2. var fruitsPackContent: Array<Fruit>?
  3. 初始化类之后,我想根据初始化的fruintsPackContent将数据从本地数据库附加到fruitsPackId。我不确定这类案件的最佳做法是什么。

    我现在所做的是创建fruitsPackContent作为计算属性,使用fruitsPackId作为参考ID从本地数据库中提取数据。

    然而,我觉得这不是正确的做法,任何想法?

    我的代码:

    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)
        }
    }
    

    修改

    使用lazy变量类型为我做了工作:

    • 类初始化与该属性无关
    • 只有在调用属性时才会使用内存
    • 该属性仅填充一次数据
    • 其他人可以使用实例方法

    新代码:

    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)
        }
    }
    

1 个答案:

答案 0 :(得分:0)

从数据库中检索数据是一个计算成本相对较高的过程,因此我个人并不喜欢将其构建为计算属性。如果您无辜地拥有执行以下操作的代码,那该怎么办:

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

如果您在数据库中有 n 项,则此代码可能会重复检索数据库 n + 1 次的所有项目的完整列表(一次用于{{ 1}}和每次下载访问的次数)。从理论上讲,您可以通过确保计算属性缓存结果来解决这个问题(并且您必须构建一些代码来识别数据库何时更新并使缓存无效)。

将数据库中的检索作为一种显式方法更加谨慎,以便应用程序开发人员知道他们何时从数据库中检索数据,以及他们何时访问缓存的数组。您通常希望避免因无意中访问某些属性而导致的一些重大隐藏性能影响。