UICollectionView无需调用reloadData()即可重新加载数据

时间:2019-05-17 12:55:54

标签: ios swift uicollectionview

我已使用MVVM模式构建了应用程序,datasource的{​​{1}}从collectionView获取数据。 在viewModel中,我有一个闭包,该闭包在更新数据后被调用,它传递了viewModel部分和IndexSet应该插入的项的[IndexPath]。但是,每次在调用insert方法后出现错误,我都会崩溃:

  

'无效的更新:无效的部分数量。更新(11)之后在集合视图中包含的部分数量必须等于更新(11)之前在集合视图中包含的部分数量,加上或减去插入或删除的部分数量(插入的11,0删除)。

我了解此错误的含义,但是我注意到这是方法调用的顺序

collectionView

正如您在下面的代码中看到的那样,我在调用每个方法之前添加了打印件,并且您可以清楚地看到numberOfSections在调用闭包之后和执行之前被调用。对于我来说,这绝对是没有道理的。我认为导致崩溃的原因在于在插入numberOfSections之前先调用它们,因为那样插入后会期望有22个节。

  

更新

     

节数

     

关闭

     

节数

代码:

 1. viewDidLoad()

 2.  numberOfSections(in collectionView: UICollectionView) // returns 0

 3.   update?(insertedSectionsSet, insertedRows) // the closure gets called in viewModel, insertedSectionsSet has 11 elements, that's correct

 4.   numberOfSections(in collectionView: UICollectionView) // returns 11, that's correct but it should be called after next point

 5.   viewModel.update = { [weak self] sections, items in
                DispatchQueue.main.async {
                    self?.collectionView.performBatchUpdates({
                        self?.collectionView.insertSections(sections) // crash
                        self?.collectionView.insertItems(at: items)
                    }, completion: nil)
                }
            }

编辑:添加了更多代码

class PlaylistsDataSource: NSObject, UICollectionViewDataSource {

    ...

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        print("numberofsections")
        return viewModel.numberOfSections
    }

    ...
}

class PlaylistsMasterViewController: UIViewController {

 ...
 viewDidLoad() {
   viewModel.update = { [weak self] sections, items in
            DispatchQueue.main.async {
                print("closure")
                self?.collectionView.performBatchUpdates({
                    self?.collectionView.insertSections(sections)
                    self?.collectionView.insertItems(at: items)
                }, completion: nil)
            }
        }
 }
 ...
}

class PlaylistsMasterViewModel {

private var sectionIndexes = [String]()
private var playlistsDictionary = [String: [AWPlaylist]]()
var update: ((IndexSet, [IndexPath]) -> Void)?

var numberOfSections: Int {
    return sectionIndexes.count
}

}

0 个答案:

没有答案