Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MKMapView必须在主线程上初始化。如何管理线程? 我搜索了类似的问题,但没有找到答案,考虑我的情况。_Ios_Multithreading_Mapkit - Fatal编程技术网

Ios MKMapView必须在主线程上初始化。如何管理线程? 我搜索了类似的问题,但没有找到答案,考虑我的情况。

Ios MKMapView必须在主线程上初始化。如何管理线程? 我搜索了类似的问题,但没有找到答案,考虑我的情况。,ios,multithreading,mapkit,Ios,Multithreading,Mapkit,我有两个视图控制器。第一个用作“启动屏幕”。它从服务器获取数据,并执行到下一个vc的转换。一切都是在主线程上完成的 override func viewDidLoad() { super.viewDidLoad() updatePickerInfoBeforeStart() } func updatePickerInfoBeforeStart() { self.retrieveCurrency{ [weak self] currencies in Cur

我有两个视图控制器。第一个用作“启动屏幕”。它从服务器获取数据,并执行到下一个vc的转换。一切都是在主线程上完成的

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.'
***由于未捕获的异常“NSRangeException”而终止应用程序,原因是:“必须在主线程上初始化initWithCoder::MKMapView。”
看起来,在从第一个vc到第二个vc的过程中,我不知道到底出了什么问题。
此外,我还有一个奇怪的bug——在第二个vc上加载一些对象的时间大约为30秒,这些对象不用于将数据绑定到它们

我想我知道你们中的一个错误。无法在viewDidLoad中执行分段,因为当前视图尚未显示

将代码移动到ViewWillAppeard方法


能否为第二视图控制器添加viewDidLoad代码?另外,您是否100%确定
retrieveCurrency
正在将其完成处理程序分派到主队列?在后台线程上运行完成处理程序(例如,使用
URLSession
completionhandlers的东西)并不少见。如果执行Swift 3,您可以在闭包中添加一行,上面写着
DispatchPremission(条件:.onQueue(.main))
以确保。正确,您不能在
viewDidLoad
中进行分段,但
retrieveCurrency
似乎是异步运行的,可能避免了该问题。此外,这不太可能导致“MKMapView必须在主线程上初始化”的错误。尽管如此,我同意将此代码移动到
viewdide
…是的,但我不确定retrieveCurrency是否在后台运行。我们怎么能确定呢?我说这是错误之一。但是,我认为这可能会导致这种情况。也许如果他开始将代码移动到viewwillbeen,这将为我们提供一个更好的解决问题的网站。谢谢,移动到viewdidsbeen解决了这个问题。此外,我将retrieveCurrency移到了主队列。