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

Ios 如何在Swift3中停止/取消回拨?,ios,swift,callback,completionhandler,Ios,Swift,Callback,Completionhandler,在我的应用程序中,我有一个进行云调用的方法。它有一个完成处理程序。在某个时候,我遇到了这样一种情况:当用户向云打这个电话时,在等待完成时,用户可能会点击“注销” 这将从堆栈中删除控制器,因此完成块将返回到不再位于堆栈上的控制器 这会导致崩溃,因为我在完成返回时执行了一些UI任务。 我做了一个变通方法,在这个方法中,我不做任何事情,因为UI不再是堆栈中的控制器 但是,我很好奇是否可以在注销时以某种方式取消/停止所有挂起的回调?为了对操作的取消进行精确控制,您可以从函数中返回取消令牌。需要取消操作时

在我的应用程序中,我有一个进行云调用的方法。它有一个完成处理程序。在某个时候,我遇到了这样一种情况:当用户向云打这个电话时,在等待完成时,用户可能会点击“注销”

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

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


但是,我很好奇是否可以在注销时以某种方式取消/停止所有挂起的回调?

为了对操作的取消进行精确控制,您可以从函数中返回取消令牌。需要取消操作时调用它

下面是一个如何实现的示例:

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

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

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

如果你被取消初始化,那么你的完整处理程序就不会继续了

如果在完成块中使用对self的弱引用,则应该能够避免任何retain/nil问题,并在VC被反初始化的情况下停止块的运行