2016-01-22 48 views
6

我有一堆視圖控制器(嵌入式導航控制器),我需要在進入下一個屏幕之前進行一些異步調用。問題是我需要在單擊映射到segue的按鈕時進行此調用,但由於異步調用尚未返回,因此會生成segue並顯示下一個視圖控制器。在異步調用返回之前,人們如何做這種事情來防止視圖控制器導航發生?在進入下一個視圖控制器之前進行異步調用(Swift)

+1

你有任何代碼可以顯示嗎? – iamalizade

+1

不要,而是在新的控制器中執行 – Wain

+0

我無法在下一個控制器中執行此操作,因爲只有在異步方法成功時纔會顯示下一個視圖控制器。 – u84six

回答

5

TL發生把東西放回主線程; DR你可以爲UIButton創建一個@IBAction,並在該函數內部進行異步調用,並在使用dispatch_async(dispatch_get_main_queue()) {}completionHandler中手動啓動segue。

要從UIViewController創建賽格瑞手動只是按Ctrl + 拖動到下一個像下面的圖片:

enter image description here

然後你會看到選擇賽格瑞的類型像這樣的畫面:

enter image description here

你選擇Show類型,你可以看到的視圖層次結構中的SEGUE你左手後選擇它在這張圖片設置爲SEGUE標識,如:

enter image description here 您可以處理你的問題,推出手動segue與函數performSegueWithIdentifier,你可以在網上參考找到很多關於如何使用Interface Builder手動創建segue的教程。

一旦你Segue公司已經創造了你可以調用它在任何你想要的,你的情況,你會稱這是異步的completionHandler裏面叫你需要把在主線程使用的dispatch_async(dispatch_get_main_queue()) {}功能大中央調度。

事情是這樣的代碼:

@IBAction func buttonTapped(sender: AnyObject) { 
    asyncFunction() { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.performSegueWithIdentifier("someID", sender: sender) 
     } 
    } 
} 

編輯: 注意,在斯威夫特3的語法發生了變化:

@IBAction func buttonTapped(_ sender: AnyObject) { 
    asyncFunction() { 
     DispatchQueue.main.async { 
      self.performSegueWithIdentifier("someID", sender: sender) 
     } 
    } 
} 

我希望這可以幫助你。

+0

考慮到我在IB中創建了segue ctrl從按鈕拖動到下一個視圖控制器,我如何取消那種「幕後」的segue動作?這不會被執行嗎? – u84six

+0

什麼意思取消segue? –

+0

那麼,如果我只是按住Ctrl鍵從按鈕拖動到視圖控制器,當我點擊按鈕時會發生segue。這在我的代碼中不會發生。這是你建立連接時的一個給定(我選擇的操作是「顯示」)。 – u84six

-4

這聽起來像你正在尋找它同步運行;所以,如果你正在使用GCD通話dispatch_sync而不是dispatch_async將在後臺線程繁重的時候,當你需要的SEGUE通過調用dispatch_sync(dispatch_get_main_queue(), ^{ // handle error or segue }

+0

我可以撥打此電話並顯示等待計時器嗎? – u84six

+1

在調度到後臺線程之前,您可以顯示一個等待計時器,並在主線程返回時刪除它。 – aduflo

+0

@aduflo您說這不是處理問題的推薦方式,異步調用主要是爲了避免凍結的UI。 –

相關問題