【发布时间】:2017-12-28 22:06:26
【问题描述】:
我有这样的功能。
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)")
}
如果失败,我不会使用代码来处理结果。那是一件坏事?如果调用失败,我是否需要一个完成处理程序,以便该函数不会留在内存中等待调用该完成处理程序?最佳做法是什么?
【问题讨论】:
-
你的 response.result 是什么类型的对象,它是否在测试中为 .success(response.result) 返回 true?
-
JSON 并且通常它会返回 true,但有时会失败。我正在使用可编码来解析它。
-
@NevinJethmalani 将第二个参数 (
Error?) 添加到您的完成处理程序。那天你真的需要返回Any吗?如果是这样,请将其更改为(Any?, Error?),否则最好返回正确的对象类型Balance? -
有两个考虑:如果存在强引用循环的风险(你将这个闭包存储为参数并且永远不会释放它),那么绝对使用
[weak self]。但这对 Alamofire 来说不是问题,因为它们在完成后会释放关闭。 (查看 Alamofire 页面,他们很少/从不使用[weak self]模式,因为它根本不需要。)另一个问题更简单:如果您发出请求并碰巧在请求完成之前关闭视图控制器,您关心吗如果它挂在视图控制器上直到请求完成? -
... 通常你不在乎,所以你不用理会
[weak self]。但是如果你这样做了(例如,如果视图控制器占用了大量内存或者请求可能非常慢),那么无论如何你都可以使用[weak self]让视图控制器在它被解除后立即被释放。所以 Radu 是正确的,您可以使用[weak self]模式,但在 Alamofire 的情况下,这通常不是问题。我当然不希望您担心在这种特殊情况下使用[weak self]来防止泄漏。但是,如果您愿意,可以使用该模式。