问题标签 [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.

0 投票
1 回答
270 浏览

swift - UICollectionViewDiffableDataSource 是否与 UICollectionViewDataSourcePrefetching 一起使用?

我的理解是 UICollectionViewDataSourcePrefetching 是为 UICollectionViewDataSource 构建的,而 UICollectionViewDiffableDataSource 似乎没有任何关于预取的文档。

0 投票
0 回答
197 浏览

swift - UICollectionViewDiffableDataSource 自定义子类初始化

所以我正在制作 UICollectionViewDiffableDataSource 的自定义子类。

我的代码如下所示:

但当然,我在 Xcode调用“self.init”或分配给“self”错误之前使用了“self”。

如何仅使用 UICollectionView 参数初始化 MyDiffableDataSource 而不会出现此错误?

我知道我可以将函数firstCell()secondCell()静态的,或者我可以将这两个函数的所有内容直接放在 init 中。但是,如果我稍后添加更多并且静态会阻止我访问其他非静态属性,那将不会很好。

还有其他我可以使用的解决方案吗?

谢谢!

0 投票
0 回答
106 浏览

ios - 调用 performFetch 后限制 diffable 数据源快照的大小

问题

在执行NSBatchBatchInsertRequest和调用之后fetchedResultsController.performFetch(),frc 的委托方法controller(_:didChangeContentWith:)被调用,NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>其中意外地包含了 Core Data 中的所有数据(即使我刚刚插入了数据)。

代码

以下是它的NSFetchedResultsController创建方式:

NSFetchRequest:_

快照应用在下面的这个NSFetchedResultsControllerDelegate方法中。

细节

  • Item示例应用程序每 5 秒接收 10,000 个实例,并NSBatchInsertRequest在新的后台上下文中运行一个performAndWait以将 s 转换并存储ItemMyManagedObject实例。
  • performFetch()然后被调用main
  • 调用performFetch()可确保在 中提供新的快照controller(_:didChangeContentWith:),数据源可以apply(_:animatingDifferences:completion:)更新 UI。
  • 这些项目填充 a UICollectionView,它连接到 a UICollectionViewDiffableDataSource<Section, NSManagedObjectID>
    • 当数据源被要求为一个特定的单元格创建一个单元格时NSManagedObjectID,正确MyManagedObject的为那个NSManagedObjectID使用fetchedResultsController.managedObjectContext.object(with:)
    • 然后将MyManagedObject转换为Item,最终用于配置单元格。

尝试解决方案

对我来说最明显的解决方案是仅实现此委托方法,但该方法似乎没有被调用:

我不希望用户界面在获取数据时出现卡顿和挂起。我认为发生这种情况的原因是因为我的快照很大。我猜为什么它们很大是因为我的获取请求获取了所有数据(但我只想将数据添加到快照中)。为了解决这个问题,我尝试设置fetchLimit一个像 2 这样的小数字,但这只会导致只获取 2 个项目。我想我可以通过更新来解决这个问题fetchOffset,但是当我滚动时这种方法可能会变得混乱。调整fetchBatchSize并没有什么不同。内存也没有泄漏。FWIW,我在后台队列中应用快照,但这似乎也没有改善 UI 卡顿。

我想在获取项目时将它们存储到 Core Data,然后仅在滚动到屏幕外单元格时从持久存储中获取。这似乎正在发生,因为当应用快照时,我可以看到数据源仅请求可见范围附近的索引路径的单元格(即使集合视图的垂直滚动条随着时间的推移而缩小)。但是快照的大小(= 到目前为止收到的项目总数)一直在​​增加。

我可以获得当前快照,并且只附加新快照中缺少的项目,但这仍然需要我通过无限大小的快照。我怎样才能避免这样做并加载大量数据而不会出现 UI 卡顿?我只是将数据插入到 Core Data 中,那么为什么我会在快照中获取所有数据?

0 投票
2 回答
69 浏览

swift - 为什么可以用这种奇怪的方式编写 UICollectionViewDiffableDataSource 初始化程序?

在通过 Paul Hudsons 的教程学习 Swift 时,我遇到了一些奇怪的事情。

UICollectionViewDiffableDataSource 的初始化器定义为:

据我所知,没有其他初始化程序。然而,Paul 像这样成功地初始化它,省略了 cellProvider 参数:

同时,Ray Wenderlich 的教程会这样做:

我试图了解 Paul 的方式背后发生了什么样的 Swift “魔法”,因为他似乎放弃了 cellProvider 参数,而是做了一些时髦的闭包事情。他在这里应用了哪些 Swift 规则?

0 投票
0 回答
170 浏览

core-data - performFetch 创建具有太多数据的可区分数据源快照

在执行NSBatchBatchInsertRequest和调用之后fetchedResultsController.performFetch(),frc 的委托方法controller(_:didChangeContentWith:)被调用,NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>其中意外包含了 Core Data 中的所有数据。

但是,我只是将数据插入到 Core Data 中。performFetch当我用数千个单元进行测试时,对每个快照应用所有数据会导致高内存负载和抖动滚动。

有没有办法让这个委托方法只接收对数据源进行增量更新的快照?

代码

以下是它的NSFetchedResultsController创建方式:

NSFetchRequest: _

快照应用在下面的这个NSFetchedResultsControllerDelegate方法中。

对我来说最明显的解决方案是仅实现此委托方法,但该方法似乎没有被调用:

数据源到核心数据连接

  • 当数据源被要求为一个特定的单元格创建一个单元格时,会为那个使用找到NSManagedObjectID正确的。MyManagedObjectNSManagedObjectIDfetchedResultsController.managedObjectContext.object(with:)
  • 然后将MyManagedObject转换为Item,最终用于配置单元格。
0 投票
1 回答
83 浏览

ios - UICollectionViewDiffableDataSource 在应用时没有正确动画

我有一个项目列表,它们在列表中按数量降序显示。我按名称对它们进行哈希处理,因此当我更改数量时,它们应该在应用时顺利重新排序。当我调用apply(snapshot, animatingDifferences: true)函数 on 时UICollectionViewDiffableDataSource,它不会以流畅的动画重新排序单元格,而是闪烁,并且一切都到位,没有“重新排序”。

0 投票
1 回答
193 浏览

ios - UICollectionView:滚动时为单元格设置动画

我想在 UICollectionView 中最顶部和最底部的单元格进入和离开屏幕时为其设置动画。我不只是想使用滚动视图代表和一次性动画制作动画。我希望动画是进度驱动的。

示例:随着单元格滚动到屏幕外,最顶部的单元格逐渐消失。

我已经在互联网上搜索了一种方法来做到这一点,但解决方案要么已经过时,要么没有达到这种效果。提前致谢。

0 投票
1 回答
65 浏览

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作为部分标识符是否正确?坠机的其他原因可能是什么?

0 投票
0 回答
305 浏览

ios - 在集合视图中应用包含所有新数据的快照后,可区分数据源滚动到顶部

我有一个集合视图(使用组合布局和可区分的数据源),它的标题中有一个分段控件。当控制值发生变化时,单元格会更新为UICollectionViewCell具有所有新数据的不同类。它主要按预期工作。问题是当我应用我的快照时,我的集合视图会滚动回顶部。我怎样才能让它不滚动?

当我的视图加载时调用:

当分段控件发生变化时调用:

设置我的单元格和补充视图:

0 投票
0 回答
178 浏览

uicollectionview - 如何在应用快照时停止 UICollectionViewDiffableDataSource 滚动集合视图?

我有一个 UICollectionViewDiffableDataSource 用于垂直滚动,具有动态高度单元格。

每次我在数据源上调用“应用”时,集合视图都会滚动一点,看起来不太好。如何防止它滚动?

我感谢您的帮助

  • 编辑:当我在可见单元格之前插入新项目/部分时,我看到视图“跳跃”/滚动了一下。如果我在它不会发生之后插入。