下面显示的源代码,
数据库:
static func insertErrorLog(moduleName: String, message: String) {
let dateToday = Date()
let timestamp = Int(Date().timeIntervalSince1970)
let db = Firestore.firestore()
let docData: [String: Any] = [
KDB.Fields.moduleName : moduleName,
KDB.Fields.message : message,
KDB.Fields.createdAt : dateToday
]
型号:
var uploadedAt: String = ""
var createdAt: String = ""
init(document: DocumentSnapshot) {
self.key = document.documentID
let json = JSON(document.data())
self.storeId = json[KDB.Fields.storeId].stringValue
self.imgName = json[KDB.Fields.imgName].stringValue
self.title = json[KDB.Fields.title].stringValue
self.description = json[KDB.Fields.description].stringValue
self.sort = json[KDB.Fields.sort].intValue
self.uploadedAt = json[KDB.Fields.uploadedAt].stringValue
self.createdAt = json[KDB.Fields.createdAt].stringValue
}
init(key: String, storeId: String, imgName: String, title: String, description: String, sort: Int, uploadedAt: String, createdImageAt: String = "") {
self.key = key
self.storeId = storeId
self.imgName = imgName
self.title = title
self.description = description
self.sort = sort
self.uploadedAt = uploadedAt
self.createdAt = createdImageAt
}
控制器:
query.getDocuments { (querySnapshot, error) in
if let error = error {
SpeedLog.print("Error: \(error.localizedDescription)")
} else {
var loop = 1
for document in (querySnapshot?.documents)! {
SpeedLog.print("documentDATA:\(document.data())")
var photoObject = Photo(document: document)
SpeedLog.print("photoObject:\(photoObject)")
if (!photoObject.imgName.isEmpty) {
let storagePath = "\(photoObject.imgName)"
SpeedLog.print("Photo storagePath: \(storagePath)")
let storage = Storage.storage()
let storageRef = storage.reference()
let imageRef = storageRef.child(storagePath)
imageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
SpeedLog.print("Photos download image error documentID:\(document.documentID) : \(error.localizedDescription)")
} else {
photoObject.imageData = UIImage(data: data!)
self.photos.append(photoObject)
if loop == 1 {
self.imageView.image = photoObject.imageData!
self.photoTitleLabel.text = "\(photoObject.title)"
self.photoCreatedAtLabel.text = "\(photoObject.createdAt)"
self.photoCreatedAtTitleLabel.isHidden = false
//}
}
}
self.collectionView.reloadData()
loop += 1
}
}
}
}
}
}
extension PhotoGalleryViewController: UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return photos.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellPhotoGallery", for: indexPath) as! PhotoGalleryCollectionViewCell
configureCell(cell, atIndexPath: indexPath)
return cell
}
func configureCell(_ cell: PhotoGalleryCollectionViewCell, atIndexPath indexPath: IndexPath) {
let photo = photos[indexPath.row]
if let image = photo.imageData {
cell.imageView.image = image
}
photoLabel.text = photo.title
photoCreatedAtLabel.text = photo.createdAt
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let photo = photos[indexPath.row]
if let image = photo.imageData {
imageView.image = image
}
photoLabel.text = photo.title
photoCreatedAtLabel.text = photo.createdAt
}
在Firebase中,我们有一个字段createdAt :(时间戳记)
基本上,当我在Xcode中运行代码时,照片存储从firebase数据中获取createdAt,但是当涉及Photo Object“ self.photoCreatedAtLabel.text =”(photoObject.createdAt)“时,日期未显示。代码中可能缺少什么?请参阅申请附件以供参考。
编辑:添加了照片对象的控制台打印输出。
photoObject:Photo (
key: "x2q0Asfjn2S8FYr6fIvA",
storeId: "",
imgName: "locator/stores/egdupo/BitoysVulcanizingandTireShop_rJTM7alkTp_M6L.jpg",
imageData: nil,
title: "",
description: "",
sort: 1,
uploadedAt: "",
createdAt: ""
)
有人吗?
谢谢。
答案 0 :(得分:0)
从FireStore文档
当前,Firestore将时间戳字段返回为“日期”,但仅返回“日期” 支持毫秒精度,这会导致截断并导致 在快照中使用时间戳作为一部分时的意外行为 后续查询。
因此,如果要使用它,您的代码需要将其作为NSDate(日期)对象进行处理。但是,使用以下代码
let settings = Firestore.firestore().settings
settings.areTimestampsInSnapshotsEnabled = true
将timestampsInSnapshots设置为true将导致Firestore返回 时间戳记值而不是日期,可避免截断。注意 您还必须将使用Date的所有代码更改为使用Timestamp。
实际上,假设我们有一个文档集合,并且每个文档中的一个字段称为图章;这样写
let now = Date()
let stamp = Timestamp(date: now)
self.db.collection("timestamps").document("test_stamp_0").setData( [
"stamp": stamp
])
然后读取该图章节点并将其格式化以在UI中输出
//read the document
if let stamp = document.get("stamp") {
let title = document.documentID
let ts = stamp as! Timestamp //force downcast stamp to a Timestamp cause' that's what it is.
let aDate = ts.dateValue()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
let formattedTimeZoneStr = formatter.string(from: aDate)
print(title, formattedTimeZoneStr) //prints test_stamp_0, 2018-10-03 08:00:00 -0400
}