Загрузка CollectionViewCell со значением nil после функции reloadData - PullRequest
0 голосов
/ 04 октября 2019

Я сделал функцию для извлечения данных для пустого массива, который я использую для collectionView. Я извлекаю информацию из двух разных дочерних узлов. Первый - это дерево «пользователи», а второй - «profile_images», использующий UID пользователей для поиска соответствующих изображений. Ячейка заполняется при загрузке представления. Моя проблема в том, что когда ячейка заполняется, я получаю нулевое значение для одного из значений.

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

var matches = [MatchData]()
// function to retrieve firebase data
private func populateInbox() {
        if let uid = Auth.auth().currentUser?.uid {
            // Supply Matches for users first
            let match = MatchData()
            Database.database().reference().child("users").observe(.childAdded) { (snapshot) in
                let matichUID = snapshot.key
                if matichUID != uid {
                    Database.database().reference().child("profile_images").child(matichUID).observeSingleEvent(of: .value, with: { (data) in
                        if let imageDict = data.value as? [String: AnyObject] {
                            match.matchImage = imageDict["imageOne"] as? String
                            print(match.matchImage)
                        }
                    })
                    if let dictionary = snapshot.value as? [String: AnyObject] {
                        print(uid, dictionary)
                        match.matchName = dictionary["firstName"] as? String
                        self.matches.append(match)
                    }
                }
                DispatchQueue.main.async {
                    self.matchList.reloadData()
                    print(self.matches.count)
                }
            }
        }
    }

// function to convert image url into UIImage
private func icon(_ imageURL: String, imageView: UIImageView) {
        let url = URL(string: imageURL)
        var image: UIImage?
        var imageData:Data?
        if url == nil {
            print("Code failed here...")
            imageView.image =  #imageLiteral(resourceName: "ic_person_outline_white_2x")
        } else {
            URLSession.shared.dataTask(with: url!) { (data, response, error) in
                if error != nil {
                    print("error")
                    DispatchQueue.main.async {
                        imageView.image = UIImage(imageLiteralResourceName: "ic_person_outline_white_2x")
                    }
                } else {
                    DispatchQueue.main.async {
                        imageData = data
                        image = UIImage(data: imageData!)
                        imageView.image = image!
                    }
                }
            }.resume()
        }
    }
// Data model
class MatchData: NSObject {
    var matchImage: String?
    var matchName: String?
}

// additional details
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "InboxCell", for: indexPath) as! InboxCell
        let matchInfo = matches[indexPath.row]
        cell.userLabel.text = matchInfo.matchName
        icon(matchInfo.matchImage ?? "", imageView: cell.userImage)
        //icon always returns nil value but Userlabel returns name value
        return cell
    }

Ожидаемый результат - наличие ячейки, отображающей изображения вдольс именем пользователя изображение тоже принадлежит. Фактические результаты - это имя профиля пользователя и нулевое значение для изображения.

1 Ответ

0 голосов
/ 04 октября 2019

Похоже, что вы добавляете совпадение в свой список совпадений до завершения обратного вызова НаблюденияSingleEventOf. Совпадение обновлений, когда изображение получено, но уже добавлено.

if let dictionary = snapshot.value as? [String: AnyObject] {
    match.matchName = dictionary["firstName"] as? String
}
if matchUID != uid {
    Database.database().reference().child("profile_images").child(matichUID).observeSingleEvent(of: .value, with: { (data) in
         if let imageDict = data.value as? [String: AnyObject] {
              match.matchImage = imageDict["imageOne"] as? String
         }
         self.matches.append(match)
         DispatchQueue.main.async {
              self.matchList.reloadData()
         }
    })

} else {
    self.matches.append(match)
    DispatchQueue.main.async {
         self.matchList.reloadData()
    }
}
...