Xcode сохраняет изображение в хранилище, но не сохраняет URL в базе данных Firebase - PullRequest
0 голосов
/ 10 июня 2019

У меня есть контроллер, который позволяет пользователям публиковать данные и сохраняет их в firebase. Когда я нажимаю «Опубликовать» и проверяю Firebase, все мои данные сохраняются, кроме изображений (которые правильно хранятся в хранилище).

мой код настроен как,

// структура находится в файле расширения, а не непосредственно в начальном контроллере представления.

struct Poster: ProducesCardViewModel{
var jobName : String?
var price: Int?
var postName: String?
var imageUrl1: String?
var imageUrl2: String?
var imageUrl3: String?
var uid: String?

init(dictionary: [String: Any]) {
    self.price = dictionary["cost"] as? Int
    self.jobName = dictionary["category"] as? String
    self.postName = dictionary["description"] as? String
    self.imageUrl1 = dictionary["imageUrl1"] as? String
    self.imageUrl2 = dictionary["imageUrl2"] as? String
    self.imageUrl3 = dictionary["imageUrl3"] as? String 
    self.uid = dictionary["fromId"] as? String ?? ""
}

// здесь начинается контроллер представления.

    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(withPath: "/JobPostImages/\(filename)")
    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 ?? "")

// Я думаю, что приведенный ниже фрагмент кода позволит мне получить доступ к URL-адресу изображения, который хранится в хранилище.

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


var poster: Poster?

    @objc func handlePost() {
    let timestamp = Int(Date().timeIntervalSince1970)
    guard let image = poster?.imageUrl1 ?? "", let image2 = image2Button.currentImage, let image3 = image3Button.currentImage, 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,

// тогда после того, как у меня будет URL-адрес изображений, я предполагаю, что смогу сохранить его после вызова приведенного ниже кода.

        "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.registerUserIntoDatabseWithUID(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://something-b1651f.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, а не в самой базе данных. Есть ли что-то важное, что мне не хватает? Я просто не понимаю, почему все остальное сохраняется в базе данных, кроме изображений, когда они хранятся в хранилище. моя база данных читает,

    category = "Electronic Help";
description = "Please ";
imageUrl1 = "";
imageUrl2 = "";
imageUrl3 = "";
location =     {
    Latitude = "40.01357523243176";
    Longitude = "-83.00691353726671";
};
price = 2;
timeStamp = 1559701053;
uid = hwCRvdWrRdfOjHg3uv0nokc5YRv2;
}
...