如何在完成不执行时以编程方式捕获案例?
我无法修改exists
方法,因为这是Firebase observe
的简单替代品。
func exists(completion: (_ a: Int) -> ()) {
//async call with a completion handler where I get the `a` value
if a % 2 == 0 {
completion(a)
}
..............//other cases
}
func check() {
exists { a in
print(a)
}
}
我想到了一些旗帜,但我怎么知道exists
结束了?
答案 0 :(得分:2)
有很多方法可以做你想要做的事情,你可以设置标志(布尔值),你可以在完成闭包中使用选项,你可以使用两个闭包......
我发布了一种我发现最好的方式,但这纯粹是主观的。
例如,您可以将完成闭包参数更改为Result
枚举。
enum Result {
case .success(Int)
case .failure
}
然后在完成闭包中,你将用这个枚举替换参数。
func exists(completion: (_ result: Result) -> ()) {
let a = arc4random()
if a % 2 == 0 {
completion(.success(a))
} else {
//other cases
completion(.failure)
}
}
func check() {
exists { result in
switch result {
case .succeess(let number):
print(number)
case .failure:
print("Finished without number")
}
}
}
答案 1 :(得分:0)
实现目标的最佳方法是使用DisptachGroup。
func exists(completion: (_ a: Int) -> ()) {
completion(1)
}
let group = DispatchGroup()
group.enter()
exists { (a) in
group.leave()
}
group.notify(queue: .main) {
print("Did finish 'exists' function!")
}