【问题标题】:putData method not being executedputData 方法没有被执行
【发布时间】: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


【解决方案1】:

我正在使用最新的 Xcode 10.2 和 Swift 5。 我到处寻找这个问题,最后,我可以用这个技巧来解决它:只需在 podfile 中将“FirebaseInstanceID”修复为“2.0.0”版本

pod 'Firebase'
pod 'Firebase/Core'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
pod 'FirebaseInstanceID', '2.0.0'
pod 'SDWebImage'
#pod 'Firebase/Firestone'
#pod 'Firebase/Messaging'

然后再次运行终端和 pod install。 最后,执行 putData 完成处理程序(甚至执行 ref.downloadURL 完成处理程序)

【讨论】:

    【解决方案2】:

    如果仍然有用的话,我有一段时间遇到同样的问题,奇怪的是它只发生在我的电脑上,当我在我的一台同事电脑上编译应用程序时,它一切正常,无论如何这是什么对我有用。

    我目前正在使用 XCode 9.4.1 和 Swift 4.0

    我以前在这两个函数中都有@objc注解:

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
    
    @objc func imagePickerControllerDidCancel(_ picker: UIImagePickerController) 
    

    我删除了那个注释,然后我将我的 pod 的版本设置如下:

    pod 'Alamofire'
    pod 'ObjectMapper'
    pod 'IQKeyboardManagerSwift', '~> 6.0'
    pod 'JTAppleCalendar', '7.1.5'
    pod 'SwiftPhotoGallery'
    pod 'SDWebImage', '~> 4.0'
    pod 'Firebase', '~> 5.0'
    pod 'Firebase/Auth', '~> 5.0'
    pod 'Firebase/Database', '~> 5.0'
    pod 'Firebase/Storage'
    pod 'Firebase/Messaging'
    

    通过该配置,该方法最终调用了完成,并且它的工作方式与我在同事计算机中的工作方式一样。

    最后这是我在 didFinishPickingMediaWithInfo 函数中的代码

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        picker.dismiss(animated: true) {
            self.starActivityIndicator()
    
            // if it's a photo from the library, not an image from the camera
            guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
            let time = Date.timeIntervalSinceReferenceDate
            let imagePath = self.viewModel.storageRef.child("images/image_\(time * 1000).jpeg")
            let metadata = StorageMetadata()
            metadata.contentType = "image/jpeg"
    
            if let uploadData = UIImagePNGRepresentation(image.resizedTo1MB()!) {
                imagePath.putData(uploadData, metadata: metadata) { (metadata, error) in
                    if let error = error {
                        self.stopActivityIndicator()
                        self.alert(message: "Ocurrió un error al enviar la imagen", title: "Error")
                        print("Error uploading: \(error.localizedDescription)")
                        return
                    }
    
                    imagePath.downloadURL(completion: { (url, error) in
                        if let error = error {
                            self.stopActivityIndicator()
                            self.alert(message: "Ocurrió un error al enviar la imagen", title: "Error")
                            print("Error getting url: \(error.localizedDescription)")
                            return
                        }
    
                        guard let url = url else { return }
                        self.stopActivityIndicator()
                    })
                }
            }
        }
    }
    

    如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2018-03-21
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多