Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDiffableSnapshot导致collectionview';即使数据没有任何更改,也可以重新调用s单元格注册_Ios_Swift_Collectionview_Diffabledatasource - Fatal编程技术网

Ios NSDiffableSnapshot导致collectionview';即使数据没有任何更改,也可以重新调用s单元格注册

Ios NSDiffableSnapshot导致collectionview';即使数据没有任何更改,也可以重新调用s单元格注册,ios,swift,collectionview,diffabledatasource,Ios,Swift,Collectionview,Diffabledatasource,我对NSDiffableDataSource有问题。我创建了这个基本示例,其中包含一个UICollectionView,其中一个项目显示一个随机数: 导入UIKit 类ViewController:UIViewController{ 枚举部分{ 主箱 } 枚举项{ 案例myItem } var collectionView:UICollectionView! var数据源:UICollectionViewDiffableDataSource! lazy var myCellRegistratio

我对
NSDiffableDataSource
有问题。我创建了这个基本示例,其中包含一个
UICollectionView
,其中一个项目显示一个随机数:

导入UIKit
类ViewController:UIViewController{
枚举部分{
主箱
}
枚举项{
案例myItem
}
var collectionView:UICollectionView!
var数据源:UICollectionViewDiffableDataSource!
lazy var myCellRegistration=UICollectionView.CellRegistration{(单元格,indexPath,3;)位于
打印(“称为手机注册”)
var content=cell.defaultContentConfiguration()
content.text=“\(Int.random(in:0…10000))”
cell.contentConfiguration=content
}
重写func viewDidLoad(){
super.viewDidLoad()
var config=UICollectionLayoutListConfiguration(外观:.InsetGroup)
let layout=UICollectionViewCompositionalLayout.list(使用:config)
collectionView=UICollectionView(帧:view.bounds,collectionViewLayout:layout)
collectionView.TranslatesAutoResizezingMaskintoConstraints=false
collectionView.backgroundColor=.systemGroupedBackground
view.addSubview(collectionView)
NSLayoutConstraint.activate([
collectionView.leadingAnchor.constraint(相等于:view.leadingAnchor),
collectionView.trailingAnchor.constraint(等式:view.trailingAnchor),
collectionView.topAnchor.constraint(等式:view.topAnchor),
collectionView.bottomAnchor.constraint(equalTo:view.bottomAnchor)
])
dataSource=UICollectionViewDiffableDataSource(collectionView:collectionView,cellProvider:{[unowned self](collectionView,indexPath,item)->UICollectionViewCell?在
开关项{
案例.我的项目:
return collectionView.dequeueConfiguredReusableCell(使用:myCellRegistration,for:indexPath,item:())
}
})
DispatchQueue.global(qos:.background).async{
虽然是真的{
睡眠(2)
DispatchQueue.main.async{
var snapshot=NSDiffableDataSourceSnapshot()
snapshot.appendSections([.main])
snapshot.appendItems([.myItem])
self.dataSource.apply(快照、动画差异:true)
}
}
}
}
}
每隔2秒,我会将相同的快照重新应用到数据源。由于快照没有更改,我希望单元格也不会更新。事实就是这样。。。有点从视觉上看,单元格没有变化(显示的数字保持不变)。但是,每次快照更新时,数据源实际上都会调用单元注册闭包,因此单元的内容配置实际上会发生更改。只是没有画出来

有人知道这里发生了什么吗

让我们简单介绍一下背景:我之所以要问这个问题,是因为我想在创建单元格的内容配置时订阅一个
组合发布者。发布者随后发布单元的数据,单元可以更新其视图,从而允许自定义动画。(我可以简单地将数据放入
项目标识符
,但是任何数据更改都会导致单元格交叉淡入新的标识符。这可不好)

它看起来像这样:

//Event.Cell是具有自定义内容配置的某个自定义单元格
lazy var myCellRegistration=UICollectionView.CellRegistration{[unowned self](单元格,indexPath,_)位于
var content=Event.ContentConfiguration()
self.myEventPublisher.sink{事件位于
content.event=事件
cell.contentConfiguration=content//重新设置contentConfiguration
}.store(in:&content.disposeBag)//将订阅服务器存储在内容配置中的dispose包中
}
由于与发布者和订阅者合作可能会很棘手(内存泄漏之类),因此我需要知道如何做到这一点而不会导致任何问题,并且快照的行为异常。至少在我看来是这样的