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:3742016-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更新,因此发生此错误.我检查了所有组件,所有组件都存在.我认为这是因为没有使用主线程.但我不知道如何解决它.
解决方法 您需要在主线程上调用新控制器,而不是在后台线程上调用.当前,您在不在主线程上呈现视图的块.使用像这样呈现视图控制器的调度队列:dispatch_async(dispatch_get_main_queue(),{var storyboard: UIStoryboard = UIStoryboard (name: "Main",bundle: nil)var vc: UIVIEwController = storyboard.instantiateVIEwControllerWithIDentifIEr("BControllerID") as UIVIEwControllerself.presentVIEwController(vc,completion: nil )}
或者在swift 3中像这样:
dispatchQueue.main.async { //your block of code }总结
以上是内存溢出为你收集整理的ios – 无法打开下一个ViewController – ***断言失败 – [UIKeyboardTaskQueue waitUntilAllTasksAreFinished]全部内容,希望文章能够帮你解决ios – 无法打开下一个ViewController – ***断言失败 – [UIKeyboardTaskQueue waitUntilAllTasksAreFinished]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)