Swift数组追加不适用于collectionView重新加载数据

时间:2018-08-03 13:08:41

标签: ios swift uicollectionview uicollectionviewcell

在我的collectionView单元中,我有一个嵌套的集合视图。它是在进行api调用(didSet)之后第一次更新的,但是当我尝试将数据追加到数据源数组并重新加载collectionView时,在加载更多机制中。更改未反映出来。这是我的代码

class PhotosCollectionViewController:    

   UICollectionViewCell,UICollectionViewDelegate,
   UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {


let network = networkingService()
let keychain = KeychainSwift()

var userID: String?
var code: String?

 var platesID: String!{

    didSet{

         let parameters: Parameters = ["code": code!, "userID": userID!, 
  "plateID": platesID!]

        network.makeGetRequestDecodable(parameters: parameters, url: 
         "endpoint") { (reponse) in


            do {


                let modeled = try JSONDecoder().decode([gps_sing].self, from:reponse)

                self.gps_singleton_posts = modeled
                print("Reload Method Called")
                self.appsCollectionView?.reloadData()


            } catch let err {
                print(err)
            }


        }


    }

}
 var gps_singleton_posts: [gps_sing]?
let gridId = "gridID"
var appsCollectionView: UICollectionView? = {

    let layout = UICollectionViewFlowLayout()
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 3


    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.backgroundColor = UIColor.white

    collectionView.translatesAutoresizingMaskIntoConstraints = false
    return collectionView

}()

override init(frame: CGRect) {

    super.init(frame: frame)





    if let value = keychain.get("userID") {
        self.userID = value
        // print("keychain\(self.userID!)")
    }
    if let value = keychain.get("security_token") {
        self.code = value
        // print("keychain\(self.code!)")
    }


    appsCollectionView?.dataSource = self
    appsCollectionView?.delegate = self
    appsCollectionView?.contentInset = UIEdgeInsetsMake(60, 0, 0, 0)
     appsCollectionView?.scrollIndicatorInsets =  UIEdgeInsetsMake(60, 
     0, 0, 0)

    addSubview(appsCollectionView!);


    addConstraintsWithFormat("H:|[v0]|", views: appsCollectionView!)
    addConstraintsWithFormat("V:|[v0]|", views: appsCollectionView!)
    appsCollectionView?.register(ImageCell.self, 
    forCellWithReuseIdentifier: gridId)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}



func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    return CGSize(width: 123, height: 123)

}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    print(gps_singleton_posts)
    if let count = gps_singleton_posts?.count{

        return count
    }

    return 0
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {


let parameters: Parameters = ["code": code!, "userID": userID!, 
"plateID": platesID!,"token":"loadScroll","lim":gps_singleton_posts! 
[(gps_singleton_posts!.count)-1].id!]


  network.makeGetRequestDecodable(parameters: parameters, url: "get/getGridPS.php") { (reponse) in


        do {


            let modeled = try JSONDecoder().decode([gps_sing].self, from:reponse)

            for model in modeled{
                self.gps_singleton_posts?.append(model)
            }
           print("Reload Method Called")
            collectionView.reloadData()
            print(self.gps_singleton_posts)

        } catch let err {
            print(err)
         }
    }
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    print(self.gps_singleton_posts?.count)

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: gridId, for: indexPath)
        as! ImageCell

    cell.backgroundColor = UIColor.red
    cell.singlePost = gps_singleton_posts![indexPath.row]

    return cell

}
func scrollViewDidScroll(_ scrollView: UIScrollView) {


    scrollView.isScrollEnabled = false
}


 }


 class ImageCell: UICollectionViewCell {


var imageViewGrid: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.frame = CGRect(x: 0, y:0 , width: 100, height: 100)
    imageView.image = UIImage(named: "delete")
    imageView.clipsToBounds = true
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

var textLabel: UILabel = {

    let lv = UILabel()
    lv.textColor = UIColor.red
    lv.translatesAutoresizingMaskIntoConstraints = false
    return lv
}()

var singlePost: gps_sing! {

    didSet{

        let imageUrl = singlePost.uid
        print(imageUrl!)

        imageViewGrid.setImageWith(NSURL(string: imageUrl!)! as URL)


    }

}

override init(frame: CGRect) {
    super.init(frame: frame)
    setUpViews()
}

func setUpViews(){

    addSubview(imageViewGrid)
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": imageViewGrid]))


    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": imageViewGrid]))

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
} 
  }

在上面的代码中(didSelectAt)函数用于加载更多项目。.但是更改不会反映出来。请帮我。非常感谢您回答我的问题。

2 个答案:

答案 0 :(得分:1)

首先:永远不要在并行线程中更改布局。

我看到在 platesID didSet中,您正在执行API调用,并且在响应中您试图重新加载collectionview。这种操作必须在主线程中完成!尝试以这种方式包装collectionview.reloadData()

DispatchQueue.main.async { [weak self] in
    self?.appsCollectionView?.reloadData()
}

我不知道这是否可以解决您的所有问题,但是reloadData()操作在辅助线程中可能无法正常工作。

布局操作必须始终在主线程上启动

答案 1 :(得分:1)

因此,我找到了解决问题的方法。在上面的集合视图中,我禁用了滚动功能。.由于该原因,重新加载数据后未显示添加的内容。一旦启用滚动,数据就会开始显示。