используя изображение, назначенное профилю пользователя в firebase, и прикрепите его к странице профиля - PullRequest
0 голосов
/ 08 мая 2020

Я везде искал в Интернете, чтобы помочь мне здесь, но я не могу понять этого. В приведенном ниже коде говорится, что позволяет сохранить изображение в базе данных firebase при регистрации пользователя:

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

func saveProfile(name: String, email: String, profileImageURL: URL, completion: @escaping ((_ success:Bool)->())){
    guard let uid = Auth.auth().currentUser?.uid else {return}

    let databaseRef = Database.database().reference().child("users/profile/\(uid)")


    let userObject = ["name":name, "email":email,
                      "photoURL":profileImageURL.absoluteString] as [String:Any]

    databaseRef.setValue(userObject) {error, ref in completion(error == nil)}
    }
}

Этот код в другом файле .swift позволяет мне получить фотографию:

static let cache = NSCache<NSString, UIImage>()

static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
        var downloadedImage:UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }

        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }

        DispatchQueue.main.async {
            completion(downloadedImage, url)
        }

    }

    dataTask.resume()
}

static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image, url)
    } else {
        downloadImage(withURL: url, completion: completion)
    }
}

код профиля пользователя:

class UserProfile {

var uid:String
var name:String
var photoURL:URL

init(uid:String, name:String, photoURL:URL){

    self.uid = uid
    self.name = name
    self.photoURL = photoURL



}

}

Я добавил файл, который позволит мне получать данные из firebase:

class ImageServices{

static let cache = NSCache<NSString, UIImage>()

static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
        var downloadedImage:UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }

        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }

        DispatchQueue.main.async {
            completion(downloadedImage, url)
        }

    }

    dataTask.resume()
}

static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image, url)
    } else {
        downloadImage(withURL: url, completion: completion)
    }
}

}

Теперь, как мне использовать это в моем viewController, чтобы на самом деле показать изображение в imageView ???

1 Ответ

1 голос
/ 10 мая 2020

Последнее редактирование вопроса задает это

Теперь, как мне использовать это в моем viewController, чтобы фактически показать изображение в imageView ???

Это указывает, что у вас есть viewController, который содержит imageView, поскольку вы спрашиваете, как назначить загруженное изображение этому imageView.

Изображение загружается здесь в вашем коде

static func downloadImage(withURL...
        var downloadedImage:UIImage
        if let data = data {
            downloadedImage = UIImage(data: data)

, поэтому один следующая строка кода возьмет загруженное изображение и отобразит его в imageView

self.myImageView.image = downloadedImage
...