Переходя к сути -
- Иметь приложение чата, которое работало нормально.
- Когда пользователь отправляет сообщение, я конвертирую местную метку времени в метку времени по Гринвичу, чтобы поддерживать международную syn c и я сохраняю GMT на сервере firebase.
- Слушатель прослушивает новое сообщение, принимает это сообщение, преобразует его обратно в локальную метку времени и обновляет представление таблицы.
Все работало безупречно, до недавнего времени я заметил забавную проблему
- Я разговаривал между симулятором и реальным устройством
- Когда реальное устройство получает чат от симулятора, я быстро отвечаю скажем, за секунду, чат отправляется, и все отсортировано правильно в соответствии с отметкой времени сообщения
- Но когда симулятор получает чат от реального устройства, и я быстро отвечаю через секунду из симулятора, чат вставляется перед предыдущим сообщением чата вместо вставки после предыдущего сообщения чата
Я заметил , что мой код и все в порядке. Проблема заключалась в том, что, когда я использую текущую метку времени Date () на моем симуляторе , кажется, что отстает на хорошие 11-15 секунд (а иногда это бывает даже 30 секунд) от использования Date () на реальном устройстве . Следовательно, когда я немедленно отправляю сообщение из симулятора, регистрируемая временная метка на сервере firebase отстает в среднем на 20 секунд, и, поскольку мои сообщения сортируются в соответствии с временной меткой, он помещает это сообщение перед последним полученным сообщением, когда на самом деле оно должно приходить после.
Это известная проблема симулятора? Я не могу протестировать его на другом реальном устройстве, потому что у меня всего одно
func sendChatMessage() {
let localDate = Date()
let GMTTimestamp = getGMTTimestamp(localDate: localDate.timeintervalsince1970)
let GMTTimestampFinal = Int64(GMTTimestamp)
//perform server write operation
}