问题标签 [uicollectionviewdiffabledatasource]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - UICollectionViewDiffableDataSource 是否与 UICollectionViewDataSourcePrefetching 一起使用?
我的理解是 UICollectionViewDataSourcePrefetching 是为 UICollectionViewDataSource 构建的,而 UICollectionViewDiffableDataSource 似乎没有任何关于预取的文档。
swift - UICollectionViewDiffableDataSource 自定义子类初始化
所以我正在制作 UICollectionViewDiffableDataSource 的自定义子类。
我的代码如下所示:
但当然,我在 Xcode调用“self.init”或分配给“self”错误之前使用了“self”。
如何仅使用 UICollectionView 参数初始化 MyDiffableDataSource 而不会出现此错误?
我知道我可以将函数firstCell()
和secondCell()
静态的,或者我可以将这两个函数的所有内容直接放在 init 中。但是,如果我稍后添加更多并且静态会阻止我访问其他非静态属性,那将不会很好。
还有其他我可以使用的解决方案吗?
谢谢!
ios - 调用 performFetch 后限制 diffable 数据源快照的大小
问题
在执行NSBatchBatchInsertRequest
和调用之后fetchedResultsController.performFetch()
,frc 的委托方法controller(_:didChangeContentWith:)
被调用,NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>
其中意外地包含了 Core Data 中的所有数据(即使我刚刚插入了新数据)。
代码
以下是它的NSFetchedResultsController
创建方式:
NSFetchRequest
:_
快照应用在下面的这个NSFetchedResultsControllerDelegate
方法中。
细节
Item
示例应用程序每 5 秒接收 10,000 个实例,并NSBatchInsertRequest
在新的后台上下文中运行一个performAndWait
以将 s 转换并存储Item
为MyManagedObject
实例。performFetch()
然后被调用main
。- 调用
performFetch()
可确保在 中提供新的快照controller(_:didChangeContentWith:)
,数据源可以apply(_:animatingDifferences:completion:)
更新 UI。 - 这些项目填充 a
UICollectionView
,它连接到 aUICollectionViewDiffableDataSource<Section, NSManagedObjectID>
。- 当数据源被要求为一个特定的单元格创建一个单元格时
NSManagedObjectID
,正确MyManagedObject
的为那个NSManagedObjectID
使用fetchedResultsController.managedObjectContext.object(with:)
。 - 然后将
MyManagedObject
转换为Item
,最终用于配置单元格。
- 当数据源被要求为一个特定的单元格创建一个单元格时
尝试解决方案
对我来说最明显的解决方案是仅实现此委托方法,但该方法似乎没有被调用:
我不希望用户界面在获取数据时出现卡顿和挂起。我认为发生这种情况的原因是因为我的快照很大。我猜为什么它们很大是因为我的获取请求获取了所有数据(但我只想将新数据添加到快照中)。为了解决这个问题,我尝试设置fetchLimit
一个像 2 这样的小数字,但这只会导致只获取 2 个项目。我想我可以通过更新来解决这个问题fetchOffset
,但是当我滚动时这种方法可能会变得混乱。调整fetchBatchSize
并没有什么不同。内存也没有泄漏。FWIW,我在后台队列中应用快照,但这似乎也没有改善 UI 卡顿。
我想在获取项目时将它们存储到 Core Data,然后仅在滚动到屏幕外单元格时从持久存储中获取。这似乎正在发生,因为当应用快照时,我可以看到数据源仅请求可见范围附近的索引路径的单元格(即使集合视图的垂直滚动条随着时间的推移而缩小)。但是快照的大小(= 到目前为止收到的项目总数)一直在增加。
我可以获得当前快照,并且只附加新快照中缺少的项目,但这仍然需要我通过无限大小的快照。我怎样才能避免这样做并加载大量数据而不会出现 UI 卡顿?我只是将新数据插入到 Core Data 中,那么为什么我会在快照中获取所有数据?
core-data - performFetch 创建具有太多数据的可区分数据源快照
在执行NSBatchBatchInsertRequest
和调用之后fetchedResultsController.performFetch()
,frc 的委托方法controller(_:didChangeContentWith:)
被调用,NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>
其中意外包含了 Core Data 中的所有数据。
但是,我只是将新数据插入到 Core Data 中。performFetch
当我用数千个单元进行测试时,对每个快照应用所有数据会导致高内存负载和抖动滚动。
有没有办法让这个委托方法只接收对数据源进行增量更新的快照?
代码
以下是它的NSFetchedResultsController
创建方式:
NSFetchRequest
: _
快照应用在下面的这个NSFetchedResultsControllerDelegate
方法中。
对我来说最明显的解决方案是仅实现此委托方法,但该方法似乎没有被调用:
数据源到核心数据连接
- 当数据源被要求为一个特定的单元格创建一个单元格时,会为那个使用找到
NSManagedObjectID
正确的。MyManagedObject
NSManagedObjectID
fetchedResultsController.managedObjectContext.object(with:)
- 然后将
MyManagedObject
转换为Item
,最终用于配置单元格。
ios - UICollectionViewDiffableDataSource 在应用时没有正确动画
我有一个项目列表,它们在列表中按数量降序显示。我按名称对它们进行哈希处理,因此当我更改数量时,它们应该在应用时顺利重新排序。当我调用apply(snapshot, animatingDifferences: true)
函数 on 时UICollectionViewDiffableDataSource
,它不会以流畅的动画重新排序单元格,而是闪烁,并且一切都到位,没有“重新排序”。
ios - UICollectionView:滚动时为单元格设置动画
我想在 UICollectionView 中最顶部和最底部的单元格进入和离开屏幕时为其设置动画。我不只是想使用滚动视图代表和一次性动画制作动画。我希望动画是进度驱动的。
示例:随着单元格滚动到屏幕外,最顶部的单元格逐渐消失。
我已经在互联网上搜索了一种方法来做到这一点,但解决方案要么已经过时,要么没有达到这种效果。提前致谢。
ios - 无效参数不满足:initialSnapshot.numberOfSections == initialSections.count
在处理一个新项目时,我们的团队决定使用它UICollectionViewDiffableDataSource
来处理我们的集合视图。它工作正常,但我们通过带有 message 的在线工具记录了(不常见的)崩溃Invalid parameter not satisfying: initialSnapshot.numberOfSections == initialSections.count
。我们似乎无法在本地重现这一点。
崩溃发生在我们用新数据更新数据源的地方,特别是在dataSource.apply(snapshot)
. 我们不确定这是如何发生的,因为数据总是以相同的方式创建的。
具体来说,处理这个视图的单位决定放弃创建截面模型,而是决定使用Int
作为截面标识符,因为他们不想使用截面,只是显示项目。这是我以前从未见过的一件事,但它Int
满足标识符的要求,因此代码确实可以正确编译。
这是代码:
集合视图和数据源创建
这些变量位于以编程方式创建的 UIView 的类中。
更新数据源
在我测试过的所有(生产)案例中,viewModel?.imageUrls
第一次调用时为空,然后在第二次调用时包含项目以及之后的所有调用。项目的数量通常不会改变。
我考虑过不使用dataSource.snapshot()
而是创建一个新的,那么我也不必deleteAllItems()
每次都打电话。但是,当我不确定这是否真的解决了问题时,我不想只是将其作为解决方案。
有没有人遇到过这样的问题?Int
使用 an作为部分标识符是否正确?坠机的其他原因可能是什么?
ios - 在集合视图中应用包含所有新数据的快照后,可区分数据源滚动到顶部
我有一个集合视图(使用组合布局和可区分的数据源),它的标题中有一个分段控件。当控制值发生变化时,单元格会更新为UICollectionViewCell
具有所有新数据的不同类。它主要按预期工作。问题是当我应用我的快照时,我的集合视图会滚动回顶部。我怎样才能让它不滚动?
当我的视图加载时调用:
当分段控件发生变化时调用:
设置我的单元格和补充视图:
uicollectionview - 如何在应用快照时停止 UICollectionViewDiffableDataSource 滚动集合视图?
我有一个 UICollectionViewDiffableDataSource 用于垂直滚动,具有动态高度单元格。
每次我在数据源上调用“应用”时,集合视图都会滚动一点,看起来不太好。如何防止它滚动?
我感谢您的帮助
- 编辑:当我在可见单元格之前插入新项目/部分时,我看到视图“跳跃”/滚动了一下。如果我在它不会发生之后插入。