如何在Swift3中停止/取消回调?

时间:2017-06-02 18:29:43

标签: ios swift callback completionhandler

在我的应用程序中,我有一个进行云调用的方法。它有一个完成处理程序。在某些时候,我遇到一种情况,当用户对云进行此调用并等待完成时,用户可能会注销。

这将从堆栈中删除控制器,因此完成块将返回到不再在堆栈上的控制器。

这会导致崩溃,因为我在完成返回时执行了一些UI任务。 我做了一个解决方法,我没有对UI做任何事情是控制器不再在堆栈上。

但是,我很好奇是否有可能在退出时以某种方式取消/停止所有待处理的回调?

2 个答案:

答案 0 :(得分:3)

我不确定,但我觉得有些东西是紧密耦合的。尝试做:

== Physical Plan ==
*Filter <function1>.apply
+- HiveTableScan [tuid#1058, puid#1059, ts#1060, dt#1055, source#1056, peer#1057], MetastoreRelation nis, dmp_puid_tuid

如果您被取消初始化,那么您的CompletioHanlder将无法继续。

答案 1 :(得分:1)

对于操作的细粒度控制&#39;取消,您可以从您的功能返回取消令牌。在需要取消操作时调用它。

这是一个如何实现的例子:

typealias CancellationToken = () -> Void

func performWithDelay(callback: @escaping () -> Void) -> CancellationToken {
    var cancelled = false
    // For the sake of example delayed async execution 
    // used to emulate callback behavior.
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        if !cancelled {
            callback()
        }
    }
    return { cancelled = true }
}

let cancellationToken = performWithDelay {
    print("test")
}

cancellationToken()

对于您只需要确保在块执行中仍然满足所有必要的先决条件和条件的情况,您可以使用guard

  { [weak self] in 
    guard let `self` = self else { return }
    // Your code here... You can write a code down there 
    // without worrying about unwrapping self or 
    // creating retain cycles.
  }