【发布时间】:2017-11-27 12:26:17
【问题描述】:
我正在尝试实现一个功能来更新用户个人资料图片,这反过来将更新(替换)Firebase 中的当前图片文件。由于某种原因,putData 方法没有在我的函数中执行(它没有运行 print 语句“code got here”)。我不确定为什么这段代码没有运行或完成该功能。提前致谢!
// edit profile viewController
var databaseRef: DatabaseReference!
var storageRef: StorageReference!
override func viewDidLoad() {
databaseRef = Database.database().reference()
storageRef = Storage.storage().reference()
loadProfileImage()
}
func handleSave() {
// save profile info to firebase
updateUsersProfile()
dismiss(animated: true, completion: nil)
}
// update picture func
func updateUsersProfile(){
//check to see if the user is logged in
if let userID = Auth.auth().currentUser?.uid {
//create an access point for the Firebase storage
let storageItem = storageRef.child("profile_images").child(userID)
//get the image uploaded from photo library
guard let image = profileImageView.image else {return}
if let newImage = UIImagePNGRepresentation(image) {
//upload to firebase storage
// code never executes this putData block ------- ?????
storageItem.putData(newImage, metadata: nil, completion: { (metadata, error) in
print("code got here")
if error != nil{
print(error!)
return
}
storageItem.downloadURL(completion: { (url, error) in
if error != nil{
print(error!)
return
}
if let profileImageUrl = metadata?.downloadURL()?.absoluteString {
let newValuesForProfile =
["profileImageUrl": profileImageUrl]
//update the firebase database for that user
self.databaseRef.child("users").child(userID).updateChildValues(newValuesForProfile, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
return
}
print("Profile Successfully Update")
})
}
})
})
}
}
}
【问题讨论】:
-
在调用 putData 之前进行打印,是否已打印?如果没有,在每个守卫之前放一个,如果让 - 也许有些东西是 nil 。 (或使用调试器设置断点并单步执行)
-
是的,它会在内部打印 if let newImage { ..... 但不会打印 storageItem.putData.... 之后的行。所以也许 storageItem 是 nil - 对吗?
-
这不是可选的。如果是,您将需要
?.。可以在 putData 中设置断点吗?还是踏入其中? -
我尝试过使用断点,但我对寻找什么没有太多经验...?谢谢
-
找到解决方案了吗?
标签: swift firebase-realtime-database save firebase-storage imageurl