reloadData на CollectionView, Swift - PullRequest
       2

reloadData на CollectionView, Swift

0 голосов
/ 18 марта 2020
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! UsersCollectionViewCell


    someRequest(username: self.usernameUrl) { (userInfo, error) in
            guard let userInfo = userInfo else {
                // present error
                return
            }
            print("Running")

            let user_image_url = userInfo.items.map{($0.avatarURL)}
            cell.userCellLabel.text = user_name[indexPath.item]                   
    }     
    return cell
}

Почему код внутри someRequest (...) не работает, когда я вызываю reloadData для viewDidAppear?

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.collectionViewUsers.reloadData()
}

Ps Somerequest просто выполнить Alamofire get

1 Ответ

1 голос
/ 18 марта 2020

Asyn c Запрос Alamofire должен быть вне обработчика cellForItemAt. Поскольку cellForItemAt вызывается каждый раз, когда ячейка появляется на экране, это означает, что она будет пытаться получить одни и те же данные для одной и той же ячейки несколько раз во время прокрутки, что не предназначено. Так что viewDidLoad - хорошее место для начала выборки, после завершения асинхронного вызова c не забудьте перезагрузить коллекцию.

var user_image_url: String?
override func viewDidLoad(_ animated: Bool) {
    someRequest(username: self.usernameUrl) { (userInfo, error) in
        guard let userInfo = userInfo else {
            // present error
            return
        }
        print("Running")

        user_image_url = userInfo.items.map{($0.avatarURL)}
        self.collectionViewUsers.reloadData()
    }
}


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! UsersCollectionViewCell
    if let user_image_url = user_image_url {
        //user_image_url is avaliable
    }
    return cell
}
...