繁体   English   中英

持有使用闭包的本地对象的强引用[Swift]

[英]Holding a Strong ref to local object that uses closure [Swift]

我对持有使用闭包的本地对象的强引用有一个疑问。 我有以下代码,其中对象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...
        }
    }
}

声明aFetcher在FUNC updateNews的范围设()
updateNews( )的范围达到终点时,将释放aFetcher。 您的内部提取功能中存在[弱自我] 在此阶段,将释放aFetcher,因为updateNews()完成其执行并且对该对象没有强引用。

您只需要向类B添加变量aFetcher即可确保对aFetcher有很强的引用。

class B {

    // MARK: - Vars
    private let aFetcher = A()

    // MARK: - Public
    func updateNews() {
        aFetcher.fetchNews(completion : {
            // parse...
        }
    }
}

您需要在课程的顶层上有一个强大的参考。

但是,不要永久保留引用并可靠地保留和释放该引用,请在class B添加一个可选的存储属性,并在完成闭包中将其设置为nil

class B {

    var fetcher : A?

    // MARK: - Public
    func updateNews() {
        fetcher = A()
        fetcher!.fetchNews(completion : { [unowned self] in
            // parse...

            self.fetcher = nil
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM