完成处理程序导致Deinit不被调用

问题描述 投票:0回答:1

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

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 }

并且不对响应做任何事情,课程将会解散。

我的功能有什么问题?我想相应地捕获响应,但不是以我的课程没有从内存中释放为代价。

swift completionhandler
1个回答
1
投票

你有一个保留周期。打破它。更改

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

UploadHelper.shared.performUpload(url: fileAssetPath) { [unowned self] response in
    if response {
       // do stuff
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.