Загрузка изображений из облачного пожарного магазина и добавление в пользовательский объект - PullRequest
0 голосов
/ 24 апреля 2019

Я использую Firebase Cloud Firestore, загружая изображение из их хранилища в качестве профиля Picture для конкретного пользователя.

Я могу установить изображение для текущего пользователя, который в данный момент вошел в систему, но когда я загружаю и устанавливаю изображение для всех других пользователей в базе данных, значение переменной UIImage для всех пользователей всегда равно нулю в массиве. Все остальные значения для пользователя действительны, поэтому это должно быть что-то с асинхронностью?

Я новичок и ценю, если кто-то может направить меня в правильном направлении.

Раньше я делал это с tableView, и это работало как обаяние, но сейчас я не могу его получить ...

func loadAllUsersFromDB() {
        db.collection("users").getDocuments { (snapshot, error) in
            if error != nil {
                print(error!)
            } else {
                for document in snapshot!.documents {
                    if let snapshotValue = document.data() as? [String : Any] {

                        let userId = snapshotValue["userID"] as? String

                        if userId == self.currentUID {
                            self.currentUser.firstName = snapshotValue["firstname"] as? String
                            self.currentUser.lastName = snapshotValue["lastname"] as? String
                            self.currentUser.email = snapshotValue["email"] as? String
                            self.currentUser.uid = snapshotValue["userID"] as? String
                            self.currentUser.aboutUser = snapshotValue["aboutUser"] as? String
                            self.currentUser.aboutDog = snapshotValue["aboutUserDog"] as? String

                          let photoURL = snapshotValue["photoURL"] as? String

                            if let url = URL(string: photoURL!) {
                                DispatchQueue.global().async {
                                    let data = try? Data(contentsOf: url)
                                    DispatchQueue.main.async {
                                        self.currentUser.profilePhoto = UIImage(data: data!)
                                    }
                                }
                            }
                        } else {

                            self.user.firstName = snapshotValue["firstname"] as? String
                            self.user.lastName = snapshotValue["lastname"] as? String
                            self.user.email = snapshotValue["email"] as? String
                            self.user.uid = snapshotValue["userID"] as? String
                            self.user.aboutUser = snapshotValue["aboutUser"] as? String
                            self.user.aboutDog = snapshotValue["aboutUserDog"] as? String

                            let photoURL = snapshotValue["photoURL"] as? String

                            if let url = URL(string: photoURL!) {
                                DispatchQueue.global().async {
                                    let data = try? Data(contentsOf: url)
                                    DispatchQueue.main.async {
                                        self.user.profilePhoto = UIImage(data: data!)
                                    }
                                }
                            }
                            self.allUsersArray.append(self.user)
                        }
                    }
                }
                self.checkIfUserIsFriends()
            }
            self.filterUsersToShow()
        }
    }

Эта строка кода работает и добавляет загруженную фотографию в currentUser, и я могу установить изображение из currentUser.profilePhoto в imageView на другом ViewController.

let photoURL = snapshotValue["photoURL"] as? String

                            if let url = URL(string: photoURL!) {
                                DispatchQueue.global().async {
                                    let data = try? Data(contentsOf: url)
                                    DispatchQueue.main.async {
                                        self.currentUser.profilePhoto = UIImage(data: data!)
                                    }
                                }
                            }
                        }

Но когда я добавляю пользователей в массив, profilePhoto для пользователя всегда равно nil.

let photoURL = snapshotValue["photoURL"] as? String

                            if let url = URL(string: photoURL!) {
                                DispatchQueue.global().async {
                                    let data = try? Data(contentsOf: url)
                                    DispatchQueue.main.async {
                                        self.user.profilePhoto = UIImage(data: data!)
                                    }
                                }
                            }

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете сохранить только URL в пользовательском объекте и использовать Kingfisher для управления загрузкой этого изображения https://github.com/onevcat/Kingfisher

Example:

import Kingfisher

let resource = ImageResource(downloadURL: URL(fileURLWithPath: "YOUR_URL"))
self.imageView.kf.indicatorType = .activity
self.imageView.kf.setImage(with: resource, placeholder: #imageliteral))
...