2017-06-02 17 views
1

在我的應用程序中,我有一種方法可以打電話給雲。它有一個完成處理程序。在某些情況下,我有一種情況,當用戶向雲呼叫並在等待完成時,用戶可能會註銷。如何在Swift3中停止/取消回調?

這將從堆棧中移除控制器,因此完成塊將返回到不再堆疊的控制器。

這會導致崩潰,因爲我在該完成返回上執行了一些UI任務。 我做了一個解決方法,其中,我沒有做任何與用戶界面是控制器不再在堆棧上。

但是,我很好奇,如果有可能在註銷時取消/停止所有掛起的回調?

+1

如果在完成塊中使用對自身的弱引用,則應該能夠避免任何保留/空問題,並在VC未被初始化的情況下停止運行塊 – PeejWeej

回答

3

我不確定,但我認爲有些東西是緊密結合的。嘗試做:

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

如果您得到初始化,那麼您的completioHanlder將不會繼續。

0

對於精細控制操作的取消,您可以從您的函數中返回一個取消標記。在需要取消操作時調用它。

下面是一個例子如何才能實現:

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. 
    } 
相關問題