Почему у меня проблема с загрузкой пи c в swift. Проблема с ноль развернуть. URL - PullRequest
0 голосов
/ 14 апреля 2020

** Обновление ** Я пытаюсь сопоставить мой profilePicLink с изображением, которое я загружаю из моей библиотеки. Также выбрано «Пользователи»: «Тип пользователя»:

var username : String = ""
var email : String = ""
var uid : String = ""
var profilePicLink : String  = ""

init(username : String, email: String, uid : String, profilePicLink: String ) {
    self.username = username
    self.email = email
    self.uid = uid
    self.profilePicLink = profilePicLink
}

У меня возникла проблема при попытке загрузить фотографию. Действие, я выбираю фотографию из моей библиотеки

 @IBAction func getPhotoButton(_ sender: Any) {
        let image = UIImagePickerController()
        image.delegate = self
        image.sourceType = UIImagePickerController.SourceType.photoLibrary
        self.present(image, animated: true, completion: nil)
    }

Это приводит меня к моей библиотеке фотографий. После того, как я выберу свою фотографию. Я нажимаю кнопку «Обновить» с действием, как показано ниже:

 @IBAction func updatePhoto(_ sender: Any) {
        uploadPhoto()
    }
    func uploadPhoto(){
        selectedUser?.uploadProfileImage(imageView.image!){
            url in print (URL.self)
        }

    }

Я получил ошибку ** Неустранимая ошибка: неожиданно обнаружил ноль при развертывании Необязательное значение: ** в шутке c uploadPhoto как изображение Неустранимая ошибка

А вот код веселья c в моем другом классе (Пользователи) для загрузки и получения изображения профиля

func getProfileImage() -> UIImage {
    if let url = NSURL(string: profilePicLink){
        if let data = NSData(contentsOf: url as URL) {
            return UIImage(data: data as Data)!
        }
    }
    return UIImage()
}

func uploadProfileImage(_ image:UIImage, completion: @escaping ((_ url:URL?)->())) {
    guard let uid = Auth.auth().currentUser?.uid else { return }
    let storageRef = Storage.storage().reference().child("user/\(uid)")

    guard let imageData = image.jpegData(compressionQuality: 0.75) else { return }

    let metaData = StorageMetadata()
    metaData.contentType = "image/jpg"

    storageRef.putData(imageData, metadata: metaData) { metaData, error in
        if error == nil, metaData != nil {

            storageRef.downloadURL { url, error in
                completion(url)
                // success!
            }
        } else {
                // failed
            completion(nil)

        }
    }
}

Обновлено Я изменил свою функцию uploadProfileImage следующим образом. Я хочу назначить переменные profilePicLink для downloadurl. А потом я обновляю значение profilePicLink

 func uploadProfileImage(_ image:UIImage, completion: @escaping ((_ url:URL?)->())) {

        let storageRef = Storage.storage().reference().child("profileImages").child("\(NSUUID().uuidString).jpg")


       guard let imageData = image.jpegData(compressionQuality: 0.75) else { return }

        let metaData = StorageMetadata()
        metaData.contentType = "image/jpg"

    storageRef.putData(imageData, metadata:metaData) { (metaData, error) in
        if error != nil, metaData != nil {
            storageRef.downloadURL (completion: {(url, error) in
                if error != nil {
                if let downloadurl = url?.absoluteString {
                if (self.profilePicLink == "") {
                self.profilePicLink = downloadurl
                   Database.database().reference().child("users").child(self.uid).updateChildValues(["profilePicLink":downloadurl])
                }
            }

        }   else {
            completion(nil)
            }
        }
            )
    }

        }

  }

Пожалуйста, сообщите об этом.

...