FloydReme
@FloydReme
Пишу музыку и программирую

Как хранить в глобальном массиве значения, полученные асинхронным путем?

Я получаю данные с Firebase и хочу хранить их в массиве структур (PostData), чтобы через него заполнять ячейки CollectionViewCell внутри TableViewCell. Проблема в том, что данные я получаю, в какой-то момент даже удается их подсчитать, а чтобы просто хранить ее в массиве и использовать между классами - без шансов :( Вот код таблицы, куда хочу принимать данные (Social.swift):
var dataPosts = [PostData]()

 override func viewDidLoad() {
        super.viewDidLoad()
        tableView = UITableView(frame: self.view.bounds, style: .grouped)
        tableView.delegate = self
        tableView.dataSource = self
        ...
        self.parsePosts() { tempData in
            self.dataPosts = tempData
            self.tableView.reloadData()
          }
    }
...
func parsePosts(completion: @escaping ([PostData]) -> Void) {
        var tempData = [PostData]()
        let databaseRef = Database.database().reference(withPath: "Посты")
        databaseRef.observe(.value) { (snapshot, error) in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let res = snap.value as! [String: Any]
                
                let title = res["Заголовок"] as! String
                let subtitle = res["Подзаголовок"] as! String
                let img = res["URL"] as! String
                let date = res["Дата"] as! String
                
                tempData.append(PostData(title: title, subtitle: subtitle, imgURL: img, date: date))
                
            }
            DispatchGroup().notify(queue: .main) {
                self.tableView.reloadData()
                let postCell = PostCell()
                postCell.dataForPosts = tempData
                print(postCell.dataForPosts, "в старом классе" ) // Выводит, что нужно
            }
            completion(tempData)
        }
    }


А вот уже код TableViewCell (PostCell.swift), где количество элементов массива dataForPosts равно нулю, хотя если вызывать с Social.swift, то все хорошо:

var dataForPosts:[PostData] = []
...
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.PostCollectionID, for: indexPath)
        print(self.dataForPosts, " - в другом классе ") // Выводит пустой массив
        cell.layer.borderWidth = 5
        cell.layer.cornerRadius = 20
        
        return cell
    }

Как можно решить эту проблему? Спасибо
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
briahas
@briahas
ObjC, Swift, Python
Если очень топорно и примитивно и такпратическиникогданеделайте- то делайте Social синглтоном и обращайтесь к нему, а не к self, в print(self.dataForPosts, " - в другом классе ")

Если по умному - то надо прокидывать экземпляр класса Social в тот класс который датасорс для таблицы в момент инициирования датасорса и затем обращаться к экземпляру класса Social уже сохраненному в проперте.

...уточняйте, спрашивайте, я представляю как со стороны видится то что я сейчас написал, но по другому сейчас не понимаю как написать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
WB—Tech Москва
от 140 000 до 160 000 ₽
Gameram Ульяновск
от 150 000 ₽