【问题标题】:How to re-initialize a lazy property from another view?如何从另一个视图重新初始化惰性属性?
【发布时间】:2020-12-01 08:45:11
【问题描述】:

我有一些数据要从磁盘读取到内存中,这需要很长时间。 我希望能够做两件事:

  1. 我不是每次加载视图时都要读取数据。
  2. 我希望能够从另一个视图调用它。
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


    【解决方案1】:

    我建议创建一个将数据加载到 data 的函数,然后在需要重新加载 data 时,只需重新分配即可。

    class DataStore {
        lazy var data: [String: String] = loadData()
    
        func readFromDisk() -> Data? {...}
    
        func processData(data: Data) -> [String:String] { ... }
    
        func loadData() -> [String:String] {
            guard let data = readFromDisk() else { return [:] }
            return processData(data: data)
        }
    }
    
    let store = DataStore()
    let data = store.data // only loaded here
    store.data = store.loadData() // reloads the data
    

    如果您不想暴露loadData 函数,您也可以创建一个单独的reloadData 函数。

    class DataStore {
        ...
        func reloadData() {
            data = loadData()
        }
    }
    

    然后不用store.data = store.loadData(),只需调用store.reloadData()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多