#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: