【问题标题】:How can I know that a completion block didn't executed but method finished?我怎么知道没有执行完成块但方法完成了?
【发布时间】:2017-08-14 07:28:22
【问题描述】:

如何以编程方式捕获未执行完成的情况?

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

【问题讨论】:

  • @MartinR,你是对的,arc4random 不是异步的 - 我已经用评论替换了那里。在exists 方法中有异步代码,并且只在一个案例上调用完成处理程序。
  • 您能否提供一些有关 exists 用法的文档链接,如果那是一个 firebase 功能,您不能修改它,因此如果您能提供其功能的链接,那就太好了。基本上我想找到一些也接受失败回调以及完成的东西
  • @JTeam,我将结束这个问题,因为我的例子不好,人们理解了别的东西。但是你很亲密,这是我原来的问题stackoverflow.com/questions/45668411/…

标签: swift


【解决方案1】:

有很多方法可以做你想做的事情,你可以设置标志(布尔值),你可以在完成闭包中使用可选项,你可以使用两个闭包......

我发布了一种我认为最好的方式,但这纯粹是主观的。

例如,您可以将完成闭包参数更改为 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")
        }
    }
}

【讨论】:

  • 我不能修改 exists 函数,它有一些异步。
  • exists 是来自 Firebase 的 observe 的占位符
  • 啊,所以您想修改 Firebase 中的现有功能?然而,令我惊讶的是,在其他情况下没有调用完成。让我阅读一下文档。
  • 我不想修改它。我只想知道完成处理程序何时不执行。
【解决方案2】:

实现您想要的最佳方式是使用 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!")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 2017-01-31
    • 1970-01-01
    • 2019-01-08
    • 2016-09-28
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多