我已经搜索了类似的问题,但是我没有找到答案,请考虑我的情况。MKMapView必须在主线程上初始化。我如何管理线程?
我有两个ViewControllers。第一个被用作“启动画面”。它从服务器获取数据,并对下一个vc执行segue。一切都在主线上完成。
override func viewDidLoad() {
super.viewDidLoad()
updatePickerInfoBeforeStart()
}
func updatePickerInfoBeforeStart() {
self.retrieveCurrency{ [weak self] currencies in
Currency.shared.currencies += currencies
self?.isReadyToGo = true
self?.performSegue(withIdentifier: "LoadCurrency", sender: nil)
}
}
第二个负责所有的操作。我刚才说MapKitView,并创建一个IBOutlet它,当我收到这样的错误
*** Terminating app due to uncaught exception 'NSRangeException', reason: '<MKMapView: 0x7ff662021200; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; layer = (null)> initWithCoder:: MKMapView must be initialized on the main thread.'
看来,从第一个VC perfoming SEGUE到第二中,但我不知道,什么是错的实际。 此外我有一个奇怪的错误 - 第二个vc上的第二个vc上的加载时间,不用于绑定数据,第二个vc约为30秒。
可以请你添加的viewDidLoad代码,第二个视图控制器? – hasan83
另外,你是否100%肯定'retrieveCurrency'正在调度它的完成处理程序到主队列?完成处理程序(例如使用'URLSession'完成处理程序的东西)在后台线程上运行并不罕见。如果使用Swift 3,在闭包中可以添加一行说'dispatchPrecondition(condition:.onQueue(.main))'来确保。 – Rob