【问题标题】:Error nil in retrieving image from Firebase Storage从 Firebase 存储中检索图像时出现错误 nil
【发布时间】:2019-08-21 11:53:46
【问题描述】:

我在从 Firebase 存储中检索 UIImage 时遇到问题,子路径似乎是正确的,尽管图像没有“下载”以显示。 Firebase 数据库的部分工作正常,因此可以检索数据,而存储部分现在可以。下面的代码和 Firebase 路径

我不明白问题是否在于我将函数嵌套到数据库检索函数的 .observeSingleEvent 中。

gs://xxxyyy-xxxyyy.appspot.com/images/QhRmIcbF7AOWjZ3nrjFd7TOekrA3/FirstImage.jpg

var cells : [Cella] = []

 var imageReference: StorageReference {
        return Storage.storage().reference().child("images")
    }


 var databaseReference: DatabaseReference {
     return Database.database().reference()
 }

func getDataFromFirebase() -> [Cella]{

        let queryRef = databaseReference.queryLimited(toLast: 1)
        var appCells : [Cella] = []

        queryRef.observeSingleEvent(of: .value, with: { (snapshot) in

            for snap in snapshot.children {
                var userPhoto : UIImage?
                let userSnap = snap as! DataSnapshot
                let customerUid = userSnap.key
                let userDict = userSnap.value as! [String:AnyObject]
                let description = userDict["description"] as! String
                let title = userDict["title"] as! String

                print(title)
                print(String(customerUid))
                print(description)

                self.descriptionsArray[String(customerUid)] = description
                self.titlesArray[String(customerUid)] = title
                 //error is here BECAUSE it can't retrive the image to be dispalyed. Title and description are fine
                self.imageReference.child(String(customerUid)).child("FirstImage.jpg").getData(maxSize: 10*1024*1024, completion: { (data, error) in

                    if error != nil {
                        print("\(String(describing: error?.localizedDescription))")
                    }

                    else {userPhoto = UIImage(data: data!)}


                    })
                let newCella = Cella(image: userPhoto!, title: title, bodyMessage: description)
                appCells.append(newCella)

                }
            })

        return appCells

    }

----- 更新 ------ 正如建议的那样,我改为使用 firebase Firestore 并在那里保存下载 URL 以及其他信息。尽管如此,我似乎无法下载图像。下面是新代码。

这是 document.data() 检索到的数据: xxx.yyy@gmail.com => [“userID”:QhRmIcbF7AOWjZ3nrjFd7TOekrA3,“userDescription”:Route66,“userImageUrl”:https://firebasestorage.googleapis.com/v0/b/shardana-61183.appspot.com/o/images%2FQhRmIcbF7AOWjZ3nrjFd7TOekrA3%2FFirstImage.jpg?alt=media&token=dea541bf-d598-414e-b4ed-a917541598d5,“userTitle”:示例]

firestoreUsersDatabase.getDocuments { (querySnapshot, error) in
        if let error = error {
            print("Error getting the documents: \(error)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
                let data = document.data()
                let imageUrl = data["userImageUrl"] as! String
                let title = data["userTitle"] as! String
                let description = data["userDescription"] as! String

                let urlDownloadReference = self.imageReference.reference(forURL: imageUrl)

                urlDownloadReference.getData(maxSize: 10*2014*2014, completion: { (data, error) in

                    if error != nil {
                        print("An error occurred: \(String(describing: error?.localizedDescription))")
                    } else {

                        guard let imageDownloaded = UIImage(data: data!) else {print("Image url returned nil value ERROR"); return}

                        let newCell = Cella(image: imageDownloaded, title: title , bodyMessage: description )
                        print("NEW CELL: Image \(newCell.image)")
                        appCells.append(newCell)

                    }
                })

            }
        }
    }

【问题讨论】:

    标签: ios swift firebase firebase-storage


    【解决方案1】:

    是的,我认为您的逻辑需要审查。您需要在 Firestore 上存储所有用户数据,包括对所需图像的所有引用。另一方面,Firebase 存储是 Firebase 中的一项不同服务,它将保存图像并为您提供下载链接,但它使用的逻辑与 Firestore 不同。

    请参阅以下示例以了解我的意思:

    https://firebase.google.com/docs/storage/web/download-files

    【讨论】:

    • 我听从了你的建议,我用新代码更新了帖子。但它仍然无法下载图像。
    • 对,所以一件事是 StorageReference,就像您从 self.imageReference 获得的一样,另一件事是您从查询中获得的正常 http 下载链接。使用正常的下载机制获取图片,如hackingwithswift.com/example-code/uikit/…
    猜你喜欢
    • 2017-07-22
    • 2020-10-23
    • 2020-06-14
    • 1970-01-01
    • 2017-08-30
    • 2017-02-23
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多