Таймер обратного отсчета на стороне сервера Swift не точен на обоих моих устройствах - PullRequest
0 голосов
/ 11 мая 2019

Я программирую приложение, используя Swift 4, в котором есть таймер обратного отсчета со значением отметки времени конечной даты, хранящимся в моем облачном хранилище реального времени Firestore.

В настоящее время я не хочу, чтобы пользователи имели возможность изменять это значение, поэтому я использую значение времени NTPKit.

Я сделал все преобразования, чтобы таймер обратного отсчета читался, и я доволен тем, как он выглядит.

Моя проблема в том, что в данный момент у меня запущено приложение на симуляторе (2017 iMac i7 16 ГБ ОЗУ. Если это помогает), то я запустил его снова, используя свой физический iPhone 8+. Я поднял экраны рядом и заметил небольшую задержку (около 1/4 секунды или меньше), и мне интересно, почему.

Оба устройства получают одинаковое значение Firestore для времени окончания, применяется одинаковое текущее время с использованием NTPKit и применяется одна и та же математика ...

Я планирую, что многие люди будут использовать это приложение и хотят знать, как заставить каждого пользователя читать в одно и то же время. Это жизненно важно.

Я пытался использовать значение сервера Google Firebase для моего текущего времени, но это был кошмар. Затем я узнал о NPTKit, и это сработало как чудо ... всего одна установка Pod.

У меня есть куча печатных утверждений, которые точно говорят мне, что происходит с точки зрения математики / конверсий, и все имеет смысл


let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in

                    self.firestoreTime() // I retrieve the FireStore end value Timestamp in this function 
                }

let gameTimeString = "\(theTime)"
            let fireStoreGameTime = gameTimeString.substring(from: 31, to: 40)

            print("Current finalTIME: \(fireStoreGameTime)")
                self.setTimer(for: fireStoreGameTime) // I convert the Firestore value into UNIX time here along with some other calculations


 let dateDiff = self.findDateDiff(timeDifference: Double(timeDifference)) // I convert the UNIX time difference here then send it into the findDateDiff function to make it readable for people.

func findDateDiff(mathTime: Double) -> String {

        let formatter = DateComponentsFormatter()
        let days = DateComponentsFormatter()
        days.allowedUnits = [.day]

        formatter.allowedUnits = [.day, .hour, .minute, .second]
        let formatted = formatter.string(from: mathTime) ?? ""
        let daysRemaining = days.string(from: mathTime) ?? ""

// Then I just do a bunch of if statements to determine what shows up in my countdown label at what time.


Программа запускается большую часть времени ... иногда я получаю случайно найденный "nil при распаковке", поэтому мне тоже нужно это исправить. Тогда главная проблема, которую я получаю, - это небольшое отставание между устройствами. Это должно быть точно.

...