我有一个类,它有两个属性:
var fruitsPackId: Int
var fruitsPackContent: Array<Fruit>?
初始化类之后,我想根据初始化的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)
}
}
答案 0 :(得分:0)
从数据库中检索数据是一个计算成本相对较高的过程,因此我个人并不喜欢将其构建为计算属性。如果您无辜地拥有执行以下操作的代码,那该怎么办:
for index in 0 ..< fruitPack.fruitsPackContent.count {
print(fruitPack.fruitsPackContent[index])
}
如果您在数据库中有 n 项,则此代码可能会重复检索数据库 n + 1 次的所有项目的完整列表(一次用于{{ 1}}和每次下载访问的次数)。从理论上讲,您可以通过确保计算属性缓存结果来解决这个问题(并且您必须构建一些代码来识别数据库何时更新并使缓存无效)。
将数据库中的检索作为一种显式方法更加谨慎,以便应用程序开发人员知道他们何时从数据库中检索数据,以及他们何时访问缓存的数组。您通常希望避免因无意中访问某些属性而导致的一些重大隐藏性能影响。