【发布时间】:2020-01-30 22:49:50
【问题描述】:
也许我不明白完成处理程序的概念,但我有一个这样的函数;
func someFunction(completion: @escaping (Bool, LoginError?) -> Void) {
self.checkDevice() { allowed, error in
if let e = error {
completion(false, e)
}
completion(true, nil)
}
}
虽然对checkDevice() 所做的事情很清楚,但基本前提是它执行异步网络调用,并返回 true 且没有错误 (nil),或返回 false 出现错误。
当我运行这段代码时,我发现完成处理程序被调用了两次。它以元组(false, error)和(true, nil)的形式发送完成。我已经进行了一些调试,似乎没有任何方式可以调用两次 someFunction()。
我相信一旦发送了completion,函数就会结束。在我的测试用例中,我强制来自checkDevice() 的错误,这将导致我将完成发送为(false, error),但我同时看到(false, error)和(true, nil)。完成不会立即结束函数吗?
【问题讨论】:
-
不,它没有。完成处理程序只是一个您可以调用的闭包,被命名为“完成”并没有赋予它任何特殊属性
-
只需将第二个
completion(true, nil)调用放在if的else子句中即可。