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