2017-02-21 89 views
1

我已经搜索了类似的问题,但是我没有找到答案,请考虑我的情况。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秒。

+1

可以请你添加的viewDidLoad代码,第二个视图控制器? – hasan83

+1

另外,你是否100%肯定'retrieveCurrency'正在调度它的完成处理程序到主队列?完成处理程序(例如使用'URLSession'完成处理程序的东西)在后台线程上运行并不罕见。如果使用Swift 3,在闭包中可以添加一行说'dispatchPrecondition(condition:.onQueue(.main))'来确保。 – Rob

回答

0

我想我知道你们其中的一个错误。您不能在viewDidLoad中执行segue,因为当前视图尚未显示。

移动你的代码到viewWillAppear中的方法。

+0

正确,你不能在'viewDidLoad'中继续,但看起来'retrieveCurrency'异步运行,可能避免了这个问题。此外,这不可能导致错误,说“MKMapView必须在主线程上初始化”。已经有人说,我同意这段代码应该移到'viewDidAppear' ... – Rob

+0

是的,但我不确定retrieveCurrency在后台运行。我们如何确定它?我说过其中的一个错误。但是,我认为这可能会导致这种情况。 – hasan83

+0

也许如果他是通过将代码移到viewWillAppear开始的,那会给我们提供一个更好的问题网站。 – hasan83