Как получить время сервера Firebase в секундах при установке / обновлении данных в firestore objective-c?

#ios #objective-c #swift #firebase #google-cloud-firestore

#iOS #objective-c #swift #firebase #google-облако-firestore

Вопрос:

Мы столкнулись с проблемой, касающейся метки времени при установке / обновлении данных в firestore. Нам нужна фактическая временная метка сервера firebase в секундах, но при использовании [[FIRTimestamp timestamp].seconds] мы получаем временную метку в секунду, но для системной даты, а не для фактической даты сервера.

Итак, как мы можем получить метку времени сервера в приложении при установке / обновлении данных? Мы также используем [FIRServerValue timestamp] , но он дает результат в формате словаря [".sv":"timestamp"] . Итак, мы попытались получить секунды из этого словаря, используя следующий способ:

 NSLog(@"%ld",(NSInteger)[FIRServerValue timestamp]/1000); //105827998577
  

Но эта временная метка, которую мы получаем, неверна.

Ответ №1:

Вы можете создать свою собственную глобальную временную метку с помощью

 let kFirebaseServerValueTimestamp = [".sv":"timestamp"]
  

и тогда вы сможете использовать kFirebaseServerValueTimestamp таким же образом.

Но вы можете использовать это только как значение или приоритет узла. Вы не сможете установить его в качестве имени ключа.

В общем, вызов allKeys в словаре не гарантирует порядок. Но если вы используете childByAutoId на узле, вы можете вернуть правильный порядок, упорядочив NSArray, возвращаемый allKeys лексикографически. Что-то вроде этого будет работать:

 [ref observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
    NSDictionary *value = snapshot.value;
    NSLog(@"Unsorted allKeys: %@", value.allKeys);
    NSArray *sortedAllKeys = [value.allKeys sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"Sorted allKeys: %@", sortedArray);
}];
  

Это похоже на сортировку NSArray в алфавитном порядке, но при сортировке автоматически сгенерированных идентификаторов вам не нужна локализованная или нечувствительная к регистру сортировка, поэтому вы используете compare: вместо localizedCaseInsensitiveCompare: