2017-02-21 25 views
1

Я искал похожие вопросы, но я не нашел ответа, рассмотрю мой случай.MKMapView должен быть инициализирован в основном потоке. Как я могу управлять потоками?

У меня есть два ViewControllers. Первый используется как «заставка». Он извлекает данные с сервера и выполняет segue для следующего 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.' 

Кажется, что во время зрелищно SEGUE от первого ВХ ко второму, но я не знаю, что это неправильно на самом деле , Кроме того, у меня есть одна странная ошибка - время загрузки второго vc некоторых объектов, которые не используются для привязки данных к ним, на втором vc составляет около 30 секунд.

+1

вы можете добавить код viewDidLoad для второго контроллера представления? – hasan83

+1

Также вы на 100% уверены, что 'retrieveCurrency' отправляет обработчик завершения в основную очередь? Это не редкость для обработчиков завершения (например, что-то, использующих обработчики завершения URLSession) для запуска в фоновом потоке. Если вы делаете Swift 3, в закрытии вы можете добавить строку, которая говорит 'dispatchPrecondition (условие: .onQueue (.main)), чтобы убедиться. – Rob

ответ

0

Думаю, я знал одну из вас ошибки. Вы не можете выполнить segue в viewDidLoad, так как текущий вид еще не появился.

Переместить свой код в режим просмотраWillAppear.

+0

Правильно, вы не можете переходить в 'viewDidLoad', но, казалось бы,' retrieveCurrency' работает асинхронно, вероятно, избегая этой проблемы. Кроме того, это вряд ли приведет к ошибке, которая говорит: «MKMapView должен быть инициализирован в основном потоке». Это было сказано, я согласен, что этот код следует перенести в 'viewDidAppear' ... – Rob

+0

Да, но я не уверен, что retrieveCurrency работает в фоновом режиме. Как мы можем быть уверены в этом? Я сказал, что это одна из ошибок. но, я думаю, это может вызвать это. – hasan83

+0

Возможно, если он начнет с перемещения кода в viewWillAppear, это даст нам лучший сайт для этой проблемы. – hasan83