UICollectionView внутри UITableView, передавая данные с Alamofire - PullRequest
0 голосов
/ 28 сентября 2019

Итак, у меня есть 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

...