** Обновление ** Я пытаюсь сопоставить мой 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)
}
}
)
}
}
}
Пожалуйста, сообщите об этом.