如何仅重新加载collectionView中的一个单元格?

时间:2018-10-31 17:03:16

标签: ios swift uicollectionview

我有一个collectionView并且有两个问题。首先,滚动太慢。我的collectionView从URL中的API接收数据,如下所示:

enter image description here

这是我的代码:

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if imageUrl.count >= 4 {
            activity.stopAnimating()
            activity.isHidden = true
        }else{
            DispatchQueue.main.async {
                self.myCollectionView.reloadData()
            }
        }

        return imageUrl.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "myViewCell", for: indexPath) as! myViewCell

        if let url = NSURL(string: imageUrl[indexPath.row]){
            if let data = NSData(contentsOf: url as URL){
                cell.carImageView.contentMode = UIViewContentMode.scaleAspectFit
                cell.carImageView.image = UIImage(data: data as Data)
            }
        }

        cell.firstLabel.text = firstLabelArray[indexPath.row]

        if secondLabelArray != []{
            cell.secondLabel.text = secondLabelArray[indexPath.row]
        }

        return cell
    }
}

第二个问题是我只需要刷新集合视图中的第三个单元格。那是我的第二个标签,但是当我尝试使用myCollectionView.reloadData()时,它会重新加载所有单元格。我需要每秒刷新第三个单元格。

3 个答案:

答案 0 :(得分:1)

要加载特定的单元格,请执行以下操作:

let indexPath = IndexPath(item: 2, section: 0)
collectionView.reloadItems(at: [indexPath])

您正在将图像加载到cellForItemAt中, 只需确保您没有在主线程上加载图像

您可以使用库下载图像并缓存图像

https://github.com/SDWebImage/SDWebImage

https://github.com/Alamofire/AlamofireImage

答案 1 :(得分:0)

集合视图比较笨拙,因为您试图在主线程上显示来自url的图像。在从api下载图像然后在主线程上更新单元格之前,请在单元格中显示一些默认图像

答案 2 :(得分:0)

collectionView滞后的问题可能是您使用NSData的方式,请考虑使用Alamofire图像,像这样

SDL_Init()