在我的應用程序中,我有一種方法可以打電話給雲。它有一個完成處理程序。在某些情況下,我有一種情況,當用戶向雲呼叫並在等待完成時,用戶可能會註銷。如何在Swift3中停止/取消回調?
這將從堆棧中移除控制器,因此完成塊將返回到不再堆疊的控制器。
這會導致崩潰,因爲我在該完成返回上執行了一些UI任務。 我做了一個解決方法,其中,我沒有做任何與用戶界面是控制器不再在堆棧上。
但是,我很好奇,如果有可能在註銷時取消/停止所有掛起的回調?
在我的應用程序中,我有一種方法可以打電話給雲。它有一個完成處理程序。在某些情況下,我有一種情況,當用戶向雲呼叫並在等待完成時,用戶可能會註銷。如何在Swift3中停止/取消回調?
這將從堆棧中移除控制器,因此完成塊將返回到不再堆疊的控制器。
這會導致崩潰,因爲我在該完成返回上執行了一些UI任務。 我做了一個解決方法,其中,我沒有做任何與用戶界面是控制器不再在堆棧上。
但是,我很好奇,如果有可能在註銷時取消/停止所有掛起的回調?
我不確定,但我認爲有些東西是緊密結合的。嘗試做:
{ [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.
}
如果在完成塊中使用對自身的弱引用,則應該能夠避免任何保留/空問題,並在VC未被初始化的情況下停止運行塊 – PeejWeej