2016-12-12 1 views
2

この問題はログインプロセスでのみ発生しています。現在のコントローラでは、(ユーザ名とパスワードを追加した後に)外部データベースに接続し、応答アプリケーションを取得した後に、現在のコントローラを終了し、次のView Controllerを開く必要があります。私はサーバーの応答を正しく取得しています。次のViewControllerを開くことができません - ***アサーションエラー - [UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished]

let postString = “lgn=sedr&UNAME=\(userName)&PASSWORD=\(password)" 

let request=NSMutableURLRequest(URL: NSURL(string:url)!) 
request.HTTPMethod = "POST"; 
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

let task = NSURLSession.sharedSession().dataTaskWithRequest(request,completionHandler:{ (data,response,error) -> Void in 

    print(NSThread.isMainThread()) 

    if error != nil { 
     // print("error=\(error)") 
     return 
    } 

    var parsingError: NSError? 

    if let dictionary = NSJSONSerialization.JSONObjectWithData(data,options: nil,error: &parsingError) as NSDictionary? { 

     println("dic: \(dictionary)") 

     if var suc:AnyObject=dictionary["success"] { 

      println("success: \(suc)") 

      if((suc as AnyObject! as Int)==1) { 

       if let userID = dictionary["userId"] { 

        println("userid: \(userID)") 
        //Save data 

        NSUserDefaults.standardUserDefaults().setObject("true",forKey:"isLogged"); 
        NSUserDefaults.standardUserDefaults().setObject(userID,forKey:"userID"); 
        NSUserDefaults.standardUserDefaults().synchronize(); 


        var storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil) 
        var vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("BControllerID") as UIViewController 

        self.presentViewController(vc ,animated: true, completion: nil) 
       } else { 
        self.displayErrorAlert("Oops! Error"); 
       } 
      } 
     } 
    } 
}); 

task.resume(); 

これは私が得たエラーログです:

2016-12-12 14:14:42.911 appService[39180:1705287] *** Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished], /SourceCache/UIKit_Sim/UIKit-3318.93/Keyboard/UIKeyboardTaskQueue.m:374 

2016-12-12 14:14:42.917 appService[39180:1705287] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.' 

私はさらにいくつかのコントローラは、同様のプロセスを行いましたが、私はこのコントローラは、この例外を取得します。

インターネットから見つかるように、このエラーは関連するアサーションが表示されず、メインスレッドをUIアップデートに使用していないために発生します。私はすべてのコンポーネントをチェックし、それらのすべてが存在します。私はこれがメインスレッドを使用していないためだと思います。しかし、私はそれを解決する方法を知らない。

答えて

7

メインスレッドではなく、バックグラウンドスレッドで新しいコントローラを呼び出す必要があります。現在、メインスレッドではなくビューを表示しているブロック。サポートのための

DispatchQueue.main.async { 
//your block of code 
} 
+0

ありがとう:このような

dispatch_async(dispatch_get_main_queue(), { var storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil) var vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("BControllerID") as UIViewController self.presentViewController(vc ,animated: true, completion: nil) } 

または3 SWIFT中:このようなビューコントローラを提示ディスパッチキューを使用してください。 –

関連する問題