Как я могу получить изображение из Firebase и отобразить его как изображение? - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время у меня настроен просмотр изображений, который ссылается на изображение, которое я храню в папке ресурсов. Как можно получить пользовательское изображение из Firebase?

lazy var profileImageView: UIImageView = {

    let imageView = UIImageView()
    imageView.image = UIImage(named: "profileUpload")
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true
    //imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
    imageView.isUserInteractionEnabled = true
    return imageView

}()

Эта функция ссылается и вытягивает profileImageUrl, который я должен был представить. Как я могу добавить это к моему предыдущему ленивому var?

func fetchUser() {
    Database.database().reference().child("users").observe(.childAdded, with: { (snapshot) in

        if let dictionary = snapshot.value as? [String: AnyObject] {
            let user = User()

            user.profileImageUrl = dictionary["profileImageUrl"]as? String

        }

    }, withCancel: nil)
}

Есть ли способ повторить этот метод, заменив ячейку на imageView? Кажется, намного проще и требует гораздо меньше кода.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserCell
    cell.textLabel?.textColor = UIColor.white
    let user = users[indexPath.row]
    cell.textLabel?.text = user.name
    cell.detailTextLabel?.text = user.email
    cell.detailTextLabel?.textColor = UIColor.white
    cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 15.0)

    if let profileImageUrl = user.profileImageUrl {
        cell.profileImageView.loadImageUsingCacheWithUrlString(profileImageUrl)
    }

    return cell
}

Приведенный выше код извлекает нужное мне изображение в виде таблицы.

1 Ответ

0 голосов
/ 29 августа 2018

Попробуйте этот код.

Сначала создайте класс customView.

import UIKit

var imageCache = [String: UIImage]()

class CustomImageView: UIImageView {

var lastUrlUsedToLoadImage: String?

func loadImage(urlString: String) {
    lastUrlUsedToLoadImage = urlString

    //Image cache
    if let cachedImage = imageCache[urlString] {
        self.image = cachedImage
        return
    }

    guard let url = URL(string: urlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        if url.absoluteString != self.lastUrlUsedToLoadImage {
            return
        }

        guard let imageData = data else { return }
        let photoImage = UIImage(data: imageData)

        imageCache[url.absoluteString] = photoImage

        DispatchQueue.main.async {
            self.image = photoImage
        }

        }.resume()
}

}

Далее создайте объект User.

import Foundation

struct User {
    let uid: String
    let username: String
    let profileImageUrl: String

    init(uid: String, dictionary: [String: Any]) {
        self.uid = uid
        self.username = dictionary["username"] as? String ?? ""
        self.profileImageUrl = dictionary["profileImageUrl"] as? String ?? ""
    }
}

Тогда, по вашему мнению, контроллер.

import UIKit
import Firebase

class UserProfileController: UICollectionViewController {

var user: User? {
  didSet {
    guard let profileImageUrl = user?.profileImageUrl else { return }
    profileImageView.loadImage(urlString: profileImageUrl)  
  }
}

lazy var profileImageView: CustomImageView = {
    let iv = CustomImageView()
    return iv
}()

override func viewDidLoad() {
    super.viewDidLoad()

    fetchUser()
}

func fetchUser() {
    guard let uid = Auth.auth().currentUser?.uid else { return }
    Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let userDictionary = snapshot.value as? [String: Any] else { return }
        self.user = User(uid: uid, dictionary: userDictionary)
    }) { (error) in
        print("Failed to fetch user for posts:", error)
    }
}

}

рад помочь ... наслаждайтесь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...