Я пробовал разные способы сохранить кнопку изображения в базе данных.Однако, как бы я ни старался, меня встречают разные ошибкиМне было интересно, может ли кто-нибудь взглянуть на мой код и, возможно, привести меня в правильном направлении.
ниже - мой @objc func handlePost ().После нажатия этой кнопки я бы хотел, чтобы пользователи могли сохранять данные в базе данных Firebase.Я ожидаю, что фотографии пользователя будут сохранены в хранилище, а затем URL-адрес будет сохранен в базе данных.
@objc func handlePost() {
let timestamp = Int(Date().timeIntervalSince1970)
guard let category = JobCategory.text, let description = JobBio.text, let cost = price.text else {
print("Error")
return
}
guard let uid = Auth.auth().currentUser?.uid else { return }
self.mapView?.isMyLocationEnabled = true
let cords = ["Latitude": self.locationManager.location!.coordinate.latitude, "Longitude": self.locationManager.location!.coordinate.longitude]
let docData: [String: Any] = [
"cords" : cords,
"uid": uid,
"category": category,
"imageUrl1": poster?.imageUrl1 ?? "",
"imageUrl2": poster?.imageUrl2 ?? "",
"imageUrl3": poster?.imageUrl3 ?? "",
"price": cost,
"description": description,
"timeStamp": timestamp
]
let hud = JGProgressHUD(style: .dark)
hud.textLabel.text = "Posting Job"
hud.show(in: view)
self.postJobDataIntoDatabseWithUID(uid: uid, values: docData as [String : AnyObject])
print("Finished saving user info")
self.dismiss(animated: true, completion: {
print("Dismissal complete")
})
hud.dismiss()
}
private func postJobDataIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
let usersReference = ref.child("JobPost").child(uid)
usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
if err != nil {
print("err")
return
}
self.dismiss(animated: true, completion: nil)
})
}
и, наконец, мой файл расширения, который управляет загрузкой фотографии в хранилище Firebase.
lazy var image1Button = createButton(selector: #selector(handleSelectPhoto))
lazy var image2Button = createButton(selector: #selector(handleSelectPhoto))
lazy var image3Button = createButton(selector: #selector(handleSelectPhoto))
@objc func handleSelectPhoto(button: UIButton) {
print("Select photo with button:", button)
let imagePicker = CustomImagePickerController()
imagePicker.delegate = self
imagePicker.imageButton = button
present(imagePicker, animated: true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let selectedImage = info[.originalImage] as? UIImage
let imageButton = (picker as? CustomImagePickerController)?.imageButton
imageButton?.setImage(selectedImage?.withRenderingMode(.alwaysOriginal), for: .normal)
dismiss(animated: true)
let filename = UUID().uuidString
let ref = Storage.storage().reference().child("job_images").child("\(filename).png")
guard let uploadData = selectedImage?.jpegData(compressionQuality: 0.75) else { return }
let hud = JGProgressHUD(style: .dark)
hud.textLabel.text = "Uploading image..."
hud.show(in: view)
ref.putData(uploadData, metadata: nil) { (nil, err) in
if let err = err {
hud.dismiss()
print("Failed to upload image to storage:", err)
return
}
print("Finished uploading image")
ref.downloadURL(completion: { (url, err) in
hud.dismiss()
if let err = err {
print("Failed to retrieve download URL:", err)
return
}
print("Finished getting download url:", url?.absoluteString ?? "")
if imageButton == self.image1Button {
self.poster?.imageUrl1 = url?.absoluteString
} else if imageButton == self.image2Button {
self.poster?.imageUrl2 = url?.absoluteString
} else {
self.poster?.imageUrl3 = url?.absoluteString
}
})
}
}
Я бы предположил, что это позволило бы мне сохранить три фотографии в базе данных Firebase, но, похоже, у меня возникла проблема с получением URL-адреса из хранилища и публикацией в базе данных.Буду очень признателен, если кто-нибудь сможет мне помочь!