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
    }

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

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

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

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

Похожие вопросы