我已经定义了sendDataToDatabase函数,但由于某种原因它无法解析photoUrl?
6个小时以来,我一直在尝试找出可能导致此问题的原因,并且似乎找不到解决方案,如果有人可以提供帮助,将不胜感激。
@IBAction func shareButton_TouchUpInside(_ sender: Any) {
ProgressHUD.show("Waiting...", interaction: false)
if let profileImg = self.selectedImage, let imageData = profileImg.jpegData(compressionQuality: 0.1) {
let photoId = NSUUID().uuidString
let storageRef = Storage.storage().reference(forURL: "manifest-bit-233115.appspot.com").child("posts").child(photoId)
storageRef.putData(imageData, metadata: nil, completion: { (metadata, Error) in
if Error != nil {
return
}
storageRef.downloadURL(completion: { (URL, Error) -> Void in
if (Error != nil) {
//handle any errors
} else {
//get download url
let photoUrl = URL?.absoluteString
}
self.sendDataToDatabase(photoUrl: photoUrl!)
})
}
)}
func sendDataToDatabase(photoUrl: photoUrl!) {
let ref = Database.database().reference()
//let uid = Auth.auth().currentUser!.uid
let postsRef = ref.child("posts")
let newPostId = postsRef.childByAutoId().key
let newPostRef = postsRef.child(newPostId!)
newPostRef.setValue(["photoUrl": photoUrl])
}
答案 0 :(得分:1)
有很多问题。
您仅需在sendDataToDatabase
分支中调用else
,并以小写字母开头声明参数。
参数是不是类型。
storageRef.downloadURL(completion: { (url, error) -> Void in
if let error = error {
//handle any errors
} else {
//get download url
let photoUrl = url!.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl)
}
})
并且您必须在函数中声明类型
func sendDataToDatabase(photoUrl: String) { ...
答案 1 :(得分:0)
这行不通:
storageRef.downloadURL(completion: { (URL, Error) -> Void in
if (Error != nil) {
//handle any errors
} else {
//get download url
let photoUrl = URL?.absoluteString
}
self.sendDataToDatabase(photoUrl: photoUrl!)
})
photoUrl仅在else子句中可用,因为这是定义的地方,因此您不能在该范围之外使用它。
另外,这个:
func sendDataToDatabase(photoUrl: photoUrl!)
应该是:
func sendDataToDatabase(photoUrl: String)
不命名变量URL
和Error
也是一个好主意,因为它们与URL和Error类相同。将它们分别命名为url
和error
。