CollectionView не отображать данные после анализа JSON - PullRequest
0 голосов
/ 14 июня 2019

После анализа JSON я получил свои данные в arraOfData ViewController, но collectionView не отображает это. Если я использую статический массив, все работает. collectionview.reloadData () не работает. На мой взгляд, нужно как-то ждать данные от разбора, потом попробовать загрузить collectionView. Я пытался использовать refresherControler для ожидания данных, но я не знаю, куда положить метод "endRefreshing" (я думаю, startRefreshing нужно в ViewDidLoad) Если я использую reloadData, как didSet в arraOfData Я получил ошибку, потому что collectionView - ноль. Использовать reloadData сразу после получения данных из парсинга у меня тоже не получилось И большая просьба рассказать пару ресурсов (статей) по этой теме, я чувствую, что у меня большие проблемы с отображением данных и в какой последовательности функции начинают загружаться. Большое спасибо.

class ViewController: UIViewController {


@IBOutlet weak var collectionView: UICollectionView!


var arraOfData = [GettingMoney]() {
    didSet {
        print("Changes: \(arraOfData.count)")
    }
}

//  let arr = ["1", "2", "3"] - test, if i use this array, collectionView display data

  override func viewDidLoad() {
    super.viewDidLoad()
    GettingMoney.fetchData()

    collectionView.dataSource = self
    collectionView.delegate = self

  }

}

extension ViewController: UICollectionViewDelegate, 
   UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return arraOfData.count
}

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCellId", for: indexPath) as? CollectionViewCell
    cell?.currentCurrency.text = "\(arraOfData[indexPath.row])"
    return cell!

  }
}

1 Ответ

2 голосов
/ 14 июня 2019

Поскольку это

GettingMoney.fetchData()

является признаком асинхронного процесса, который не перезагружает коллекцию, то же самое делает

func fetchData(completion:@escaping ([String]) -> ()) {
    Api.load {
      completion(arr)
    }
} 

Затем используйте как

GettingMoney.fetchData { arr in
   self.arraOfData = arr
   DispatchQueue.main.async {
     self.collectionView.reloadData()
  }
}

Здесь не прямой случай, как у вас Возвращение данных из асинхронного вызова в функции Swift

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