Итак, у меня есть TableView, и внутри первой ячейки я поместил UICollectionView.Я использую Alamofire и SwiftyJSON для получения данных и передачи их в массив.Внутри функции cellForRow я передаю первый массив в массив внутри ячейки TableView, а затем передаю его в ячейку CollectionView.Но проблема в том, что функции TableView запускаются до завершения Alamofire, и поэтому он пропустит пустой массив.Как мне запустить Alamofire раньше всего?
Первый контроллер , где я использую Alamofire:
class DiscoverController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// MARK: -- TOP Books
var topBooks = [Book]()
@IBOutlet weak var discoverBooksTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
discoverBooksTable.isHidden = true
bookHTTP(url: "https://api.example.com/top/book")
}
// MARK: -- TableView Configuration
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let topBookCell = discoverBooksTable.dequeueReusableCell(withIdentifier: "topBooksCell") as! TopBooksCell
topBookCell.bookCollections.append(contentsOf: topBooks)
return topBookCell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 140
}
// MARK: -- Alamofire
func bookHTTP(url:String) {
Alamofire.request(url).responseJSON { (responseData) -> Void in
if ((responseData.result.value) != nil) {
let booksData = JSON(responseData.result.value!)
if booksData["request_cached"] == true {
print("⚠️ \(booksData["request_cached"].boolValue)")
if let booksDATA = booksData["top"].array {
for bookItems in booksDATA {
self.topBooks.append(Book(id: bookItems["b_id"].intValue, title: bookItems["title"].stringValue, type: bookItems["type"].stringValue, bookItems["series"].intValue, bookItems["url"].stringValue, bookItems["image_url"].stringValue, bookItems["rank"].intValue))
}
self.discoverBooksTable.isHidden = false
self.discoverBooksTable.reloadData()
}
}
for i in self.topBooks {
print("? \(i.title ?? "N/A")")
}
}
}
}
}
TopBookCell Файл:
class TopBookCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var topBooksCollectionView: UICollectionView!
// Book collection array
var bookCollections = [Book]()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
print(bookCollections)
}
// MARK: -- CollectionView Configuration
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return bookCollections.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let topBookCol = collectionView.dequeueReusableCell(withReuseIdentifier: "topBooksCollectionCell", for: indexPath) as! TopBooksCollectionCell
topBookCol.topBookCover.kf.setImage(with: URL(string: bookCollections[indexPath.row].image_url!))
return topBookCol
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
и внутри TopBooksCollectionCell У меня есть IBOutlet для UIImageView
GITHUB : https://github.com/iarata/UICollectionViewInsideUITableView