gpt4 book ai didi

swift - 从未调用完成处理程序

转载 作者:行者123 更新时间:2023-11-28 06:06:38 27 4
gpt4 key购买 nike

我有一个这样的函数。

class func getAccountBalances(completionHandler:@escaping ((_ balances:Any) -> Void)){
//Alamofire request and we get the result. But sometimes the result fails.
switch response.result {
case .success(let value):
completionHandler(value)
case .failure(let error):
print ("error is: \(error)")
}

如果失败,我不会编写代码来处理结果。那是一件坏事?在调用失败的情况下,我是否需要一个完成处理程序,以便该函数不会留在内存中等待调用该完成处理程序?最佳做法是什么?

最佳答案

一般来说,在每个案例上调用完成是一个很好的做法。这样做的原因是您通常想让上层(业务逻辑层)决定是否应将某些余额(例如)标记为已保存,或者在发生错误时显示对话框。这是一个很好的实践,认为一切都应该是一个模块。话虽这么说,如果另一个模块想要在某个时候调用相同的函数,那么让该模块处理结果可能是一个好主意。这可以通过多种方式实现,我不会在这里输入,这是你的决定。

但是,这不是必须的。如果一个 block 不会被调用,它应该被释放,然后一切都是好的内存。因此,在您的示例中,如果您不在其他地方保留该 block (例如,将其保存在进行 getAccountBalances 调用的类中的变量中),您应该没问题。

另一个重要的部分是,当您调用该函数时,请注意不要在 block 内保留 self 的地方造成内存泄漏:

getAccountBalances() { _ in 
self.updateUI()
}

此 block 将创建对自身的保留,如果调用一切正常,但用户离开了屏幕,您最终可能会使用已释放的变量并使应用程序崩溃。这里的一个好的做法是不要在回调中保留 self ,而是在此之前使其变弱:

getAccountBalances() { [weak self] _ in 
// This is not necessarily needed, and you could use self?.updateUI() instead.
// However, this is usually another thing i like to do and consider it a good practice
guard let `self` = self else { return }
self.updateUI()
}

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com