Я программирую приложение, используя 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 при распаковке", поэтому мне тоже нужно это исправить. Тогда главная проблема, которую я получаю, - это небольшое отставание между устройствами. Это должно быть точно.