【发布时间】:2020-12-01 08:45:11
【问题描述】:
我有一些数据要从磁盘读取到内存中,这需要很长时间。 我希望能够做两件事:
- 我不是每次加载视图时都要读取数据。
- 我希望能够从另一个视图调用它。
lazy var data: [String: String] = {
guard let data = readFromDisk() else { return [:] }
return processData(data: data)
}()
第一次加载视图时,上面的代码只初始化一次,这对于消除不必要的计算是完美的。问题是我还希望能够在需要时从另一个视图触发它。
我试图触发重新初始化:
func getData() {
guard let data = readFromDisk() else { return [:] }
data = processData(data: data)
}
并从另一个视图调用它:
let vc = ViewController()
vc.getData()
但是,不起作用。
我试图看看我是否可以使用static,因为它也是lazy,但我收到一条错误消息:
实例成员不能用于类型“ViewController”
最后,我尝试创建一个单独的类:
class DataImporter {
var data: [String: String] {
guard let data = readFromDisk() else { return [:] }
return processData(data: data)
}
func readFromDisk() -> [String: String] {}
func processData(data: [String: String]) -> [String: String] {}
}
并在ViewController 中拥有惰性属性:
lazy var importer = DataImporter()
认为实例化一个类实现了利用惰性属性和在需要时调用它的双重效果:
let vc = ViewController()
vc.importer = DataImporter()
由于某种不理想的原因,这会将类实例化大约一百次。
【问题讨论】:
标签: ios swift lazy-loading computed-properties