2016-04-12 27 views
0

在異步執行的塊/閉包內,我希望在執行塊之前檢查當前狀態。檢查塊/關閉完成後的當前視圖狀態

這是一個常見的例子,它出現在NSURLsession請求之後,繼續延伸到下一個View Controller。

下面是一個例子:

@IBAction func tappedButton(sender: UIButton) { 

    //This closure named fetchHistorical goes to the internet and fetches an array 
    //The response is then sent to the next view controller along with a segue 

    Order.fetchHistorical(orderID, completionHandler: { (resultEnum) ->() in 
      switch resultEnum { 
      case .Success(let result): 
       let orderItemsArray = result.orderItems!.allObjects 
       self.performSegueWithIdentifier("showExchanges", sender: orderItemsArray) 

      default: 
       let _ = errorModal(title: "Error", message: "Failed!") 
      } 
    }) 
} 

假設用戶已經不耐煩,拍了拍這個按鈕3次。

這將意味着這個函數將被調用三次,並且每次它會試圖延續到下一個視圖控制器(iOS很好地阻止了這個問題,「警告:嘗試呈現其視圖不在窗口層次結構中! 「)

我想知道你們如何解決這個問題?是否像封閉內的東西,檢查你是否仍然在當前的視圖控制器中...如果你是,那麼繼續是有效的。如果不是的話,你可能已經陷入困境,並且不會再次執行這個segue。

***更一般地說,你如何檢查閉包內的當前狀態,因爲閉包是異步執行的?

回答

0

由於閉包在主線程中沒有執行,所以如果您在此處檢查它(如您所述),狀態將會準確無誤。你可以使用GCD去主線程並檢查那裏的狀態。有幾種方法可以讓這些代碼不會多次運行。如果執行計算需要一些時間,則可以使用活動性指示器讓用戶知道應用程序此刻正忙碌。如果你希望用戶仍然有按下按鈕的選項,你可以把類似這樣的標記:

var buttonWasTapped:Bool = false //class property 
@IBAction func tappedButton(sender: UIButton) { 
    if !self.buttonWasTapped{ 
     self.buttonWasTapped = true 
    } 
} 

然後改回爲false viewDidAppear這樣他們就可以在該網頁顯示每次按下一次。

0

當開始一些需要一些時間才能完成的任務時,我會做兩件事;

  1. 顯示某種活動的指標,使用戶知道有事情發生
  2. 禁用按鈕,以便有進一步的跡象表明該請求已收到,並防止用戶敲擊多次。

重要的是,您不僅要考慮應用程序的正確操作,還要提供良好的用戶體驗。

相關問題