我如何知道完成块没有执行但方法已完成?

时间:2017-08-14 07:28:22

标签: swift

如何在完成不执行时以编程方式捕获案例?

我无法修改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结束了?

2 个答案:

答案 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!")
}