【发布时间】: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