Ваш coreRouter
объявлен локально в функции, что означает, что он будет удален, как только функция будет завершена.К моменту завершения асинхронного метода ваш объект будет удален.
Решение:
объявляет let coreRouter = NMACoreRouter()
на уровне класса и вызывает метод только внутри функции
Грязная альтернатива
обернуть вашу асинхронную функцию calculateRoute
вызов внутри DispatchQueue.main.async { /* place here */ }
Настоятельно предложил бы первый вариант, так как второй заморозил бы любую другую логикудо завершения называется (но технически это работает :)).