【问题标题】:How to convert timeStamp value wrapped in an optional into a double?如何将包含在可选中的时间戳值转换为双精度值?
【发布时间】:2019-03-12 03:56:22
【问题描述】:

我目前有一个函数,它根据一些初步信息从 firebase 获取图像,在与图像相同的树级别是时间戳值(对于每个图像)。我一直无法获得价值,只能获得Optional(123131.432432),这当然不是我需要的。

功能如下:

    func fetchAllPostImages() {
    print("fetchAllPostImages function")
    self.ref.child("Posts").child(self.userID).child(self.postNum).child("Images").observe(.childAdded, with: { snapshot in
        var snapshotUrl = snapshot.childSnapshot(forPath: "ImageUrl")
        var timeStampData = snapshot.childSnapshot(forPath: "timeStamp").value

        print("fhdsjaklhfkjdsfksahdjksfjlashfkljdhs")
        print(snapshot.childSnapshot(forPath: "ImageUrl"))
        print(snapshot.childSnapshot(forPath: "timeStamp").value, "timestamp123")
        print(snapshotUrl.value as? [String: String], "value")

            if let urlValue = snapshotUrl.value {
                print("jkdhsjbbvcbcbcbccbbbbbbbbbbbbbbb")
                let snapShotValue = [ "ImageUrl" : urlValue]
                let timeStampVal = ["timeStamp" : timeStampData]

                print(timeStampVal, "dsfaf")
                for (_, value) in snapShotValue {

                    if let imageURL = URL(string: value as! String) {
                        print(imageURL, "image url here")
                        do {
                            let imageAsData = try Data(contentsOf: imageURL)
                            let image = UIImage(data: imageAsData)
                            var timeStamp = 0.0
                            self.arrayOfImgObj.append(Media(image: image!, timeStamp: timeStamp))
                            self.tableView.reloadData()
                            print(self.arrayOfImgObj.count, "array.count")
                        } catch {
                            print("imageURL was not able to be converted into data")
                        }
                    }
                }
        }
    })
}

所以我能够执行以下操作,这似乎可行,但是在 tableView 中我看到与以前相同的 Optional(5421432.43214)。即使当我打印它时,它也是我需要的双重价值。

for (value, timeValue) in zip(snapShotValue.values, timeStampVal) {
    if let imageURL = URL(string: value as! String) {
        print(imageURL, "image url here")
        do {
            let imageAsData = try Data(contentsOf: imageURL)
            let image = UIImage(data: imageAsData)
            var timeStampValue = timeValue as! Double
            print(timeStampValue, "fgsdfg")
            let timeStamp: Double = timeStampValue
            self.arrayOfImgObj.append(Media(image: image!, timeStamp: timeStamp))
            self.tableView.reloadData()
            print(self.arrayOfImgObj.count, "array.count")
        } catch {
            print("imageURL was not able to be converted into data")
        }
    }
}

如何将封装在可选项中的时间戳值转换为双精度值?

【问题讨论】:

  • 这是一个可选的。就像您在您发布的代码中解开其他选项一样正确解开它。
  • @rmaddy 检查更新
  • 564030781.136256 fgsdfg 是我打印值时得到的,但我在 tableView 中得到可选的东西
  • 你在某个地方还有另一个可选的。调试你的代码。找出它来自哪里。然后拆开。顺便说一句 - 使用 as! 是个坏主意。如果它为 nil,它将崩溃。
  • 您可以在您的问题中发布您的 Firebase 数据的 sn-p 吗?你的时间戳和我的时间戳可能是两个不同的东西。此外,将来,请将您的代码减少到重现问题所需的最低限度。那里有很多垃圾代码,只会让它更难阅读。见How to create a Minimal, Complete, and Verifiable example。此外, let snapShotValue = [ "ImageUrl" : urlValue] 看起来 snapShotValue 是一个单独的 URL,但随后您对其进行迭代,这很奇怪。 snapShotValue 中的 (_, value)。代码非常混乱。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

基本上,最简单的方法是将Int 添加到您调用arrayOfImg[indexPath.row].timeStamp 的位置。所以它应该是这样的:

let timeStamp = "\(Int(arrayOfImg[indexPath.row].timeStamp))"

【讨论】:

    【解决方案2】:

    尝试替换

    let timeStamp: Double = timeStampValue
    

    guard let timeStamp = timeStampValue as Double else { return }
    

    这将安全地解开您的可选项并将值转换为 Double。

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多