【问题标题】:How to apply [weak self] to a swift function (not closure)如何将 [weak self] 应用于 swift 函数(不是闭包)
【发布时间】:2020-06-04 10:45:50
【问题描述】:

假设我有一个具有完成功能的网络功能,并且我在消费者中多次使用它,如下所示:

class Network {
   func getNumber(completion: @escaping (Int) -> ()) {
      //some network code
      completion(5)
   }
}

class MyClass {
var num = 0
let network = Network()

func myFunc() {
    network.getNumber { [weak self] (number) in
        self?.num = number
    }
}

func myFunc2() {
    network.getNumber { [weak self] (number) in
        self?.num = number
    }
}

}

为了避免重复代码,我用一个函数替换了闭包 像这样:

class MyClass {
var num = 0
let network = Network()

func myFunc() {
    network.getNumber(completion: self.handleData)
}

func myFunc2() {
    network.getNumber(completion: self.handleData)
}

func handleData(_ number: Int) -> () {
    self.num = number
}
}

这种方法的问题是我无法在handleData 函数中将self 捕获为weak

通过将handleData 更改为closure 可以轻松避免该问题,如下所示:

lazy var handleData: (Int) -> () = { [weak self] in
    self?.num = $0
}

所以我的问题是:有没有办法将weak self 应用于 函数 而不仅仅是闭包?

【问题讨论】:

  • 在这种情况下你真的不需要担心弱自我,因为没有保留周期。
  • 你是对的。请允许我编辑帖子:)
  • 即使您进行了编辑,也没有保留周期,因为 getNumber 函数不包含对属性闭包的引用。它只是保存在堆上。在大多数情况下,使用完成处理程序,您无需担心整个弱自舞。

标签: ios swift closures weak-references


【解决方案1】:

如果您想在其功能上使用weakself 的引用,您可以这样做:

class MyClass {
    var num = 0

    func myFunc() {
        Network.getNumber { [weak self] in
            self?.handleData($0)
        }
    }

    func myFunc2() {
        Network.getNumber { [weak self] in
            self?.handleData($0)
        }
    }

    func handleData(_ number: Int) {
        self.num = number
    }
}

此外,您不必为不返回任何内容的函数提供 -> ()

【讨论】:

  • 您确定您从头开始阅读我的整个问题吗?我在第一个 sn-p 中确实带来了这个
  • 您希望结果如何?我认为没有其他方法可以实现您想要的。
【解决方案2】:

考虑到handleData 可以很大,怎么样

func myFunc() {
    Network.getNumber { [weak self] i in self?.handleData(i) }
}

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2015-10-12
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多