2016-12-12 5 views
2

У меня возникла эта проблема только для процесса входа. В текущем контроллере подключаться к внешней базе данных (после добавления имени пользователя и пароля), а после получения ответа приложение должно отклонить текущий контроллер и открыть следующий диспетчер представлений. Я получаю ответ сервера правильно.Невозможно открыть следующий ViewController - *** Ошибка утверждения - [UIKeyboardTaskQueue waitUntilAllTasksAreFinished]

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

Вам необходимо вызывать новый контроллер на основном потоке, а не на фоновом потоке. В настоящий момент блок, в котором вы представляете представление не в основном потоке. Использование очереди отправки, которая, представляя контроллер представления, как это:

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, как это:

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

Спасибо за поддержку. –

 Смежные вопросы

  • Нет связанных вопросов^_^