Как постоянно пересчитать функцию, основным параметром которой является текущее время - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь вычислить орбитальную позицию спутника и другие точки данных в зависимости от моего текущего времени. В настоящее время у меня есть класс «Вычисления» со всеми моими вычислениями, включая две основные функции: keplerianElementsToECEF и ecefToData. В представлении контроллера вид загрузки я ввел 6 элементов keplerian, эпоху и дату расчета (текущая дата). Однако, несмотря на то, что калькуляция выполняется и мое табличное представление отображает значения точно, значения не обновляются, и табличное представление просто отображает вычисления для начальной даты, в которую было загружено представление. Я почти уверен, что проблема вызвана размещением даты в представлении контроллера, загруженном, но я не знаю, как обойти эту проблему.

  var date = Date()
    var dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    var dateAtCalculationAsString: String = dateFormatter.string(from: date)

    // converting User's current time to UTC time to aid in computations
    let dateAtCalculation = localToUTC(date: dateAtCalculationAsString)
    print(dateAtCalculation)

    //let epoch = epoch, let inclination = inclination, let longitudeAscendingNode = longitudeAscendingNode, let eccentricity = eccentricity, let argumentPerigee = argumentPerigee, let meanAnomaly = meanAnomaly, let meanMotion = meanMotion {

    Calculations.shared.keplerianElementsToECEF(meanMotion: meanMotion!, eccentricity: eccentricity! , Inclination: inclination!, LongitudeAscendingNode: longitudeAscendingNode!, argumentPerigee: argumentPerigee!, M0: meanAnomaly!, epoch: epoch!, date: dateAtCalculation)


    datavalues = Calculations.shared.ecefToData()

1 Ответ

0 голосов
/ 27 июня 2019

Всякий раз, когда вам нужно что-то обновить на регулярной основе или по прошествии некоторого времени, вы можете рассмотреть Таймер .Установите новый повторяющийся экземпляр Timer с замыканием, которое обновляет ваши вычисления, а затем перезагружает вашу таблицу.

Например, предположим, что опубликованный вами код находится внутри функции с именем performCalculations().Вы можете сделать что-то вроде:

var recalculateTimer: Timer!

func performCalculations() {
    // all the date math
}

func viewDidLoad() {
    super.viewDidLoad()
    performCalculations()
    recalculateTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] timer in
        guard let self = self else {
            timer.invalidate()
            return
        }
        self.performCalculations()
        self.tableView.reloadData()
    }
}

Это будет перезапускать вашу математику и обновлять datavalues каждую секунду, а затем перезагружать таблицу.Он также останавливает таймер, когда освобождается контроллер представления, поэтому, если вы отклоните модальное представление, содержащее этот контроллер, или извлечете его из стека навигации, вы не будете обновляться вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...