2016-05-05 3 views
2

У меня есть приложение для чата, которое работает на Firebase, и я хотел бы получить временную метку из Firebase, прежде чем нажимать любые данные.Получение метки времени Firebase перед нажатием данных

В частности, я хотел бы получить время, когда пользователь нажимает кнопку отправки для голосового сообщения. Я на самом деле не нажимаю сообщение Firebase до тех пор, пока загрузка не будет успешной (чтобы гарантировать, что аудиофайл будет там, когда получатель получит сообщение). Если бы я просто использовал Firebase.ServerValue.TIMESTAMP, может возникнуть проблема с заказом из-за разных длительностей загрузки. (Например, очень короткое сообщение, например, очень длинное).

Есть ли все-таки, чтобы пинговать Firebase за метку времени, которую я не вижу в документах? Спасибо!

+0

Я не очень понимаю проблему. Если вы назовете 'push()' ключ будет основан на локальном времени, когда пользователь нажал кнопку. Если вы используете 'Firebase.ServerValue.TIMESTAMP', то значение, записанное в базу данных, будет именно тогда, когда данные будут записаны на диск. Каким будет конфликт? Можете ли вы записать его в фрагменте кода, который показывает проблему? –

+0

Помогает ли это? 1. Пользователь нажимает «отправить» 2. Аудиофайл начинает загрузку. 3. Аудиофайл завершает загрузку. 4. В обратном вызове завершения работы audioFinishedUploading я записываю данные сообщения в Firebase. Мне нужна отметка времени с момента, когда пользователь нажимает «отправить». – Justin

+0

Я разработал его так, чтобы, если загрузка аудио не удалась, сообщение не отправляется. – Justin

ответ

3

Если вы хотите отделить щелчок, от фактического написания данных:

var newItemRef = ref.push(); 
uploadAudioAndThen(audioFile, function(downloadURL) { 
    newItemRef.set({ 
     url: downloadURL, 
     savedTimestamp: Firebase.ServerValue.TIMESTAMP 
    }); 
}); 

Это делает несколько вещей:

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

  2. Затем он загружается и «ждет его».

  3. в обработчике завершения работы загрузки, он записывает в новое местоположение он определяет на этапе 1.

  4. записывает метку времени сервера в данный момент, который при окончании загрузки

Итак, у вас теперь есть две метки времени. Один из них - когда загрузка началась и закодирована в ключе/push-идентификаторе нового элемента, другая - когда загрузка завершена и находится в свойстве savedTimestamp.

Чтобы получить 3 совсем недавно созданные закачки, которые уже завершены:

ref.orderByKey().limitToLast(3).on(... 

Чтобы получить 3 совсем недавно законченные загрузки:

ref.orderByChild('savedTimestamp').limitToLast(3).on(... 
+0

Это отличный ответ, и большое спасибо за его письмо. Я не думал использовать автогенерируемые ключи как временные метки. Хотя это решит проблему, наша система уже использует настраиваемую схему идентификаторов. Интересно, считаете ли вы, что простое совмещение временного смещения .info с меткой времени клиента является приемлемым решением здесь? – Justin

+1

Объединение локальной метки времени с известным смещением даст вам то же значение, что и в идентификаторе push.:-) Так что да, это так же верно. –

+0

Если мой ответ был полезен, нажмите кнопку вверху слева от него. Если он ответил на ваш вопрос, нажмите галочку, чтобы принять его. Таким образом, другие знают, что вам (в достаточной мере) помогли. –

Смежные вопросы