Я везде искал в Интернете, чтобы помочь мне здесь, но я не могу понять этого. В приведенном ниже коде говорится, что позволяет сохранить изображение в базе данных 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 ???