swift - 完成处理程序导致不调用 deinit

标签 swift completionhandler

我有一个包含完成处理程序的网络任务,允许我确定任务是否以及何时成功完成;

func performUpload(url: URL, completionHandler: @escaping (_ response: Bool) -> ()) {
    photoSave.savePhotoRemote(assetURL: url) { response in
        completionHandler(response)
    }
}

我使用以下代码从另一个 UIView 调用此函数;

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

我注意到的是,当我捕获响应做一些事情 时,调用此函数的类将永远不会取消初始化。但是,如果我将我的功能更改为以下内容;

UploadHelper.shared.performUpload(url: fileAssetPath) { response in }

不要对响应做任何事情,该类将取消初始化。

我的函数做错了什么?我想相应地捕获响应,但不以我的类不从内存中释放为代价。

最佳答案

您有一个保留周期。打破它。改变

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

UploadHelper.shared.performUpload(url: fileAssetPath) { [unowned self] response in
    if response {
       // do stuff
    }
}

关于swift - 完成处理程序导致不调用 deinit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55910229/

相关文章:

java - 在java中通过asynchronousFileChannel写入时丢失数据

java - AsynchronousByteChannel 的线程含义

swift - MacOS Quartz Event Tap 监听错误事件

ios - 我如何关闭 swift.sqlite 中的事件连接以交换其 sqlite.file

constants - "let"关键字在 Swift 中究竟是如何工作的?

swift - 在 swift 中使用 GCD 的竞争条件

Swift:带有完成处理程序的多线程

ios - 如何使用 Swift 配置后台应用刷新?

swift - 从闭包返回值并完成的函数

swift - 如何在 Swift 中为 SKScene 中的手势编写代码?