pav*_*lag 3 xcode ios swift xcode6 ios8
我正在使用NSURLSession向服务器发出请求.为此,我使用自定义completionHandler创建NSURLSessionTask.
根据结果,我想切换到另一个视图.但是,当我在完成处理程序中执行此操作时,它不起作用.该应用程序崩溃,出现以下错误:
NSInternalInconsistencyException
Run Code Online (Sandbox Code Playgroud)
完整的错误描述如下:
*** 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.'
Run Code Online (Sandbox Code Playgroud)
注意:要更改视图,请使用以下代码
let vc: AnyObject! = self.storyboard?.instantiateViewControllerWithIdentifier(viewID)
self.showViewController(vc as UIViewController, sender: vc)
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
Rob*_*Rob 10
主要问题是您的错误消息报告"...可能只能从主线程调用".因此,您可能已经在后台线程中调用了此代码(可能是网络请求的完成块或类似的东西).所以你必须将这段代码发送回主队列:
dispatch_async(dispatch_get_main_queue()) {
let vc = self.storyboard.instantiateViewControllerWithIdentifier(viewID) as UIViewController
showViewController(vc, sender: self)
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码段会进行一些次要的,无关的更改,即:
将目标视图控制器指定为自己的发送方是没有意义的.通常你会使用当前的视图控制器或一些UIKit控件作为sender.
我指定self为sender,因为我认为你在源视图控制器中这样做了.或者,如果这是IBAction一个按钮,也许你会使用它本身的sender参数IBAction,而不是源视图控制器.
我会失去AnyObject演员.我知道编译器可能会建议你,但它没有帮助代码的易读性.我建议直接把它投到一个UIViewController.
| 归档时间: |
|
| 查看次数: |
3670 次 |
| 最近记录: |