我已使用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
}
}