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

问题描述:

在我的应用程序中,我有一种方法可以打电话给云。它有一个完成处理程序。在某些情况下,我有一种情况,当用户向云呼叫并在等待完成时,用户可能会注销。如何在Swift3中停止/取消回调?

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

这会导致崩溃,因为我在该完成返回上执行了一些UI任务。 我做了一个解决方法,其中,我没有做任何与用户界面是控制器不再在堆栈上。

但是,我很好奇,如果有可能在注销时取消/停止所有挂起的回调?

+1

如果在完成块中使用对自身的弱引用,则应该能够避免任何保留/空问题,并在VC未被初始化的情况下停止运行块 – PeejWeej

我不确定,但我认为有些东西是紧密结合的。尝试做:

{ [weak self]() -> Void in 
      guard let _ = self else { return } 
//rest of your code 
} 

如果您得到初始化,那么您的completioHanlder将不会继续。

对于精细控制操作的取消,您可以从您的函数中返回一个取消标记。在需要取消操作时调用它。

下面是一个例子如何才能实现:

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. 
    }