2017-02-21 76 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

相關問題