Как получить дату в Firebase - PullRequest
0 голосов
/ 02 октября 2018

Исходный код показан ниже,

База данных:

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 мыесть поле createAt: (Timestamp)

По сути, когда я запускаю коды в Xcode, хранилище фотографий извлекает созданный Att из данных базы данных, но когда дело доходит до объекта Photo "self.photoCreatedAtLabel.text =" (photoObject.createAt) "дата не показана. Что может быть пропущено в кодах? См. приложение для справки.

Редактировать: добавлена ​​распечатка на консоли объекта фотографии.

photoObject:Photo (
   key: "x2q0Asfjn2S8FYr6fIvA", 
   storeId: "", 
   imgName: "locator/stores/egdupo/BitoysVulcanizingandTireShop_rJTM7alkTp_M6L.jpg", 
   imageData: nil, 
   title: "", 
   description: "", 
   sort: 1, 
   uploadedAt: "", 
   createdAt: ""
)

Date Uploaded 2 of 2

Кто-нибудь?

Заранее спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

Из документов FireStore

В настоящее время Firestore возвращает поля меток времени как Дата, но Дата поддерживает только точность в миллисекундах, что приводит к усечению и вызывает непредвиденное поведение при использовании метки времени из снимка как частипоследующий запрос.

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

let settings = Firestore.firestore().settings
settings.areTimestampsInSnapshotsEnabled = true

Установка для timestampsInSnapshots значения true приведет к тому, что Firestore будет возвращать значения Timestamp вместо Date, что позволяет избежать усечения.Обратите внимание, что вы также должны изменить любой код, который использует Date, чтобы использовать вместо него метку времени.

На практике предположим, что у нас есть коллекция документов, и одно из полей в каждом документе называется stamp;написано так

let now = Date()
let stamp = Timestamp(date: now)
self.db.collection("timestamps").document("test_stamp_0").setData( [
   "stamp": stamp
])

, чтобы затем прочитать этот узел штампа и отформатировать его для вывода в пользовательском интерфейсе

//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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...