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