Память cra sh с загрузкой изображения в Firebase Storage Swift - PullRequest
1 голос
/ 07 февраля 2020

Я сделаю это быстро. Приблизительно в 10% случаев, когда пользователь загружает фотографию своего профиля, приложение вылетает из-за утечки памяти. Я пробовал множество разных вещей, чтобы попытаться предотвратить это, но по какой-то причине это случается нечасто. Пожалуйста, я не знаю, почему некоторые пользователи загружают фотографию sh. (Я предполагаю, что это происходит в функции didFinishPickingMediaWithInfo).

class CustomImagePickerController: UIImagePickerController  {
    var imageBttn: UIButton?
}

@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
    }

extension EnterPhotoController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        weak var selectedImage = info[.originalImage] as? UIImage
        let imageButton = (picker as? CustomImagePickerController)?.imageBttn
        imageButton?.setImage(selectedImage?.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 = selectedImage?.jpegData(compressionQuality: 0.75) 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)
            }
        }
    }
}

   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)

      }
 }

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

обновленный код для всех, кому небезразлично!

   @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!
  }
}

0 голосов
/ 07 февраля 2020

Вам нужно изменить размер изображения до меньшего размера. Все мы знаем, что фотографии, снятые ios устройствами, довольно большие, и отправка их в виде данных на сервер также является большой рабочей нагрузкой. Вы можете изменить размер изображения по своему вкусу, не теряя при этом его качества.

Проверьте это для изменения размера. { ссылка }

Надеюсь, это поможет: Спасибо:)

...