Swift 将图像上载到Firebase存储时内存崩溃

Swift 将图像上载到Firebase存储时内存崩溃,swift,memory,google-cloud-firestore,firebase-storage,Swift,Memory,Google Cloud Firestore,Firebase Storage,我会尽快的。大约10%的用户上传个人资料照片时,应用程序会因内存泄漏而崩溃。我尝试了很多不同的方法来防止这种情况发生,但由于某些原因,这种情况很少发生。我不知道为什么某些用户上传照片时会崩溃。(我假设它发生在didFinishPickingMediaWithInfo函数中) 您需要将图像大小调整为较小的大小。我们都知道,ios设备捕获的照片非常大,将其作为数据发送到服务器也是一个很大的工作量。您可以根据自己的喜好调整图像大小,而不会丢失大部分图像质量 检查此项以调整大小。 希望这有帮助:谢谢:

我会尽快的。大约10%的用户上传个人资料照片时,应用程序会因内存泄漏而崩溃。我尝试了很多不同的方法来防止这种情况发生,但由于某些原因,这种情况很少发生。我不知道为什么某些用户上传照片时会崩溃。(我假设它发生在didFinishPickingMediaWithInfo函数中)


您需要将图像大小调整为较小的大小。我们都知道,ios设备捕获的照片非常大,将其作为数据发送到服务器也是一个很大的工作量。您可以根据自己的喜好调整图像大小,而不会丢失大部分图像质量

检查此项以调整大小。


希望这有帮助:谢谢:)

您需要将图像大小调整为较小的大小。我们都知道,ios设备捕获的照片非常大,将其作为数据发送到服务器也是一个很大的工作量。您可以根据自己的喜好调整图像大小,而不会丢失大部分图像质量

检查此项以调整大小。


希望这有帮助:谢谢:)

为关心此事的人更新了代码

   @objc private func handleSelectPhoto() {
        let alert = UIAlertController(title: "Access your photos", message: "Can Crusht open your photos so you can select a profile picture?", preferredStyle: .alert)

        let action = UIAlertAction(title: "Yes", style: .default){(UIAlertAction) in
            let imagePicker = CustomImagePickerController()
            imagePicker.delegate = self
            imagePicker.imageBttn = self.selectPhotoButton
           self.present(imagePicker, animated: true)
        }

        let cancel = UIAlertAction(title: "No", style: .cancel, handler: nil)
        alert.addAction(action)
        alert.addAction(cancel)
        self.present(alert, animated: true, completion: nil)
        return
    }

    private func saveInfoToFirestore(imageUrl: String){
        let uid = Auth.auth().currentUser?.uid ?? ""
        let docData: [String: Any] = ["ImageUrl1": imageUrl]
        Firestore.firestore().collection("users").document(uid).setData(docData, merge: true) { (err) in
            guard err == nil else { return }
            let customtabController = CustomTabBarController()
            customtabController.modalPresentationStyle = .fullScreen
            self.present(customtabController, animated: true)

        }
    }
extension EnterPhotoController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        weak var selectedImage = info[.originalImage] as? UIImage
        let selectedImage2 = selectedImage?.resizeImage(targetSize: CGSize(width: 540, height: 500))
        let imageButton = (picker as? CustomImagePickerController)?.imageBttn
        imageButton?.setImage(selectedImage2?.withRenderingMode(.alwaysOriginal), for: .normal)
        self.imageFull = true

        dismiss(animated: true)

        self.errorLabel.text = "Registering, hang tight..."
        self.errorLabel.isHidden = false
        self.selectPhotoButton.isEnabled = false

        let filename = UUID().uuidString
        let ref = Storage.storage().reference(withPath: "/images/\(filename)")
        guard let imageData = selectedImage2?.jpegData(compressionQuality: 0.9) else { return }

        ref.putData(imageData, metadata: nil) { (nil, err) in
            guard err == nil else { return }
            ref.downloadURL { (url, err) in
                guard err == nil else { return }
                let imageUrl = url?.absoluteString ?? ""
                if imageUrl == "" {
                    print("fuck me man")
                }

                self.saveInfoToFirestore(imageUrl: imageUrl)
            }
        }
    }
}

extension UIImage {
  func resizeImage(targetSize: CGSize) -> UIImage {
    //print("hi")
    let size = self.size
    let widthRatio  = targetSize.width  / size.width
    let heightRatio = targetSize.height / size.height
    let newSize = widthRatio > heightRatio ?  CGSize(width: size.width * heightRatio, height: size.height * heightRatio) : CGSize(width: size.width * widthRatio,  height: size.height * widthRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
    self.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
  }
}


为关心的人更新代码

   @objc private func handleSelectPhoto() {
        let alert = UIAlertController(title: "Access your photos", message: "Can Crusht open your photos so you can select a profile picture?", preferredStyle: .alert)

        let action = UIAlertAction(title: "Yes", style: .default){(UIAlertAction) in
            let imagePicker = CustomImagePickerController()
            imagePicker.delegate = self
            imagePicker.imageBttn = self.selectPhotoButton
           self.present(imagePicker, animated: true)
        }

        let cancel = UIAlertAction(title: "No", style: .cancel, handler: nil)
        alert.addAction(action)
        alert.addAction(cancel)
        self.present(alert, animated: true, completion: nil)
        return
    }

    private func saveInfoToFirestore(imageUrl: String){
        let uid = Auth.auth().currentUser?.uid ?? ""
        let docData: [String: Any] = ["ImageUrl1": imageUrl]
        Firestore.firestore().collection("users").document(uid).setData(docData, merge: true) { (err) in
            guard err == nil else { return }
            let customtabController = CustomTabBarController()
            customtabController.modalPresentationStyle = .fullScreen
            self.present(customtabController, animated: true)

        }
    }
extension EnterPhotoController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        weak var selectedImage = info[.originalImage] as? UIImage
        let selectedImage2 = selectedImage?.resizeImage(targetSize: CGSize(width: 540, height: 500))
        let imageButton = (picker as? CustomImagePickerController)?.imageBttn
        imageButton?.setImage(selectedImage2?.withRenderingMode(.alwaysOriginal), for: .normal)
        self.imageFull = true

        dismiss(animated: true)

        self.errorLabel.text = "Registering, hang tight..."
        self.errorLabel.isHidden = false
        self.selectPhotoButton.isEnabled = false

        let filename = UUID().uuidString
        let ref = Storage.storage().reference(withPath: "/images/\(filename)")
        guard let imageData = selectedImage2?.jpegData(compressionQuality: 0.9) else { return }

        ref.putData(imageData, metadata: nil) { (nil, err) in
            guard err == nil else { return }
            ref.downloadURL { (url, err) in
                guard err == nil else { return }
                let imageUrl = url?.absoluteString ?? ""
                if imageUrl == "" {
                    print("fuck me man")
                }

                self.saveInfoToFirestore(imageUrl: imageUrl)
            }
        }
    }
}

extension UIImage {
  func resizeImage(targetSize: CGSize) -> UIImage {
    //print("hi")
    let size = self.size
    let widthRatio  = targetSize.width  / size.width
    let heightRatio = targetSize.height / size.height
    let newSize = widthRatio > heightRatio ?  CGSize(width: size.width * heightRatio, height: size.height * heightRatio) : CGSize(width: size.width * widthRatio,  height: size.height * widthRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
    self.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
  }
}