【发布时间】:2019-05-16 16:17:22
【问题描述】:
我有一个关于持有使用闭包的本地对象的强引用的问题。 我有以下代码,其中对象 B 使用了一个关闭类型 A 的本地对象的方法。 对象 A 中的方法使用异步操作执行一些网络任务,然后将闭包返回给对象 b。 由于对象 A 在 B 的方法中是本地的,并且由于我在对象 A 异步任务中使用 [weak self](以防止保留循环),因此该对象被释放。
为了确保本地 A 对象只有在闭包完成后才会被释放,我应该在以下代码中进行哪些更改?
这是重要代码的一部分:
class A {
var restAPI: RestAPI?
func fetchNews(completion: (_ json: [String:Any])->()) {
// .....
self.restAPI.fetch(url: url, results: { [weak self] (json) in //
completion(json)
})
// .....
}
}
class B {
// ....
// ... call to updateNews()
func updateNews() {
let aFetcher: A()
aFetcher.fetchNews(completion : {
// <<<< // aFetcher gets released and closue never called
// parse...
}
}
}
【问题讨论】:
-
其实这个问题没有好的解决办法。主要问题是线程安全。您最好在 A 类实例中定义和初始化变量
restAPI“outside”,该变量必须超过 B 类实例。您还需要在创建它的同一线程上销毁它。最好在 A 类的实例中再次这样做。
标签: ios swift memory closures strong-parameters