2014-09-04 57 views
3

我正在使用NSURLSession向服務器發出請求。爲此,我使用自定義的completionHandler創建一個NSURLSessionTask。根據任務結果切換視圖swift

根據結果我想切換到另一個視圖。但是,當我在完成處理程序中執行此操作時,它不起作用。

NSInternalInconsistencyException 

受此描述完整的錯誤:

*** Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished], /SourceCache/UIKit_Sim/UIKit-3302.3.1/Keyboard/UIKeyboardTaskQueue.m:374 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.' 

注:與下面的錯誤應用崩潰更改視圖我用下面的代碼

let vc: AnyObject! = self.storyboard?.instantiateViewControllerWithIdentifier(viewID) 
self.showViewController(vc as UIViewController, sender: vc) 

什麼是錯的這裏?

+0

@Rob我現在添加了錯誤。另外,我試圖遵循你的建議,但它不起作用。 – pavlag 2014-09-04 23:14:15

+0

我已經使用過它,它沒有區別。但可以肯定的是,這應該是我的完成處理程序,對嗎? – pavlag 2014-09-04 23:51:24

+0

哦,等一下!我的錯。我在調度方法之前調用了showViewController,並且也在調度方法中調用showViewController!我刪除了第一個,現在都好了!謝謝@rob – pavlag 2014-09-05 00:04:38

回答

10

主要問題是您的錯誤消息報告「...只能從主線程調用」。所以你可能已經從後臺線程中調用了這段代碼(也許是網絡請求的完成塊或類似的東西)。所以,你必須調度此代碼回到主隊列:

dispatch_async(dispatch_get_main_queue()) { 
    let vc = self.storyboard.instantiateViewControllerWithIdentifier(viewID) as UIViewController 
    showViewController(vc, sender: self) 
} 

注意,這個代碼片斷,使一些小的,不相關的更改,即:

  1. 它沒有意義指定目標視圖控制器作爲其自己的發件人。通常你會使用當前視圖控制器或一些UIKit控件作爲sender

    我指定self作爲sender,因爲我假設你在源視圖控制器中這樣做了。或者,如果這是按鈕的IBAction,那麼您可能會使用IBActionsender參數,而不是源視圖控制器。我會失去AnyObject劇組。我知道編譯器可能向你提出了這個建議,但它不利於代碼的易讀性。我建議直接將它鑄造成UIViewController

+0

謝謝@rob ...那也適用於我.. – 2014-12-03 09:31:32

1

任何影響用戶界面的事情都必須在主線程上運行,而不是在完成處理程序中運行。因此,在您的完成處理程序中,調用performSelectorOnMainThread或使用允許您將該調用放入主線程的其他機制之一。

+0

你可以舉一個例子使用那個函數嗎? xcode不會以我試過的方式進行編譯。 – pavlag 2014-09-04 22:40:13