问题标签 [diffabledatasource]

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 投票
0 回答
39 浏览

ios - 除了较旧的实现之外的 Diffable 数据源

除了支持较低 ios 版本的旧实现之外,是否可以使用 diffable 数据源。

0 投票
2 回答
781 浏览

swift - Swift DiffableDataSource 进行插入和删除而不是重新加载

我很难理解 DiffableDataSource 是如何工作的。我有这样的 ViewModel

我的 tableView 由上面的 ViewModele 之类的 cachedItems 填充。当 API 响应到达时,我想添加一个新的,删除缺少的一个,刷新 tableView 中已经存在的项目的 viewModel.value 并最终订购它。一切正常,除了一件事 - 重新加载项目。

我对 DiffableDataSource 的理解是,它比较 item.hash() 以检测该项目是否已经存在,如果存在,那么如果 cachedItem != apiItem,它应该重新加载。不幸的是,这不起作用,快照确实删除和插入而不是重新加载。

DiffableDataSource 应该这样做吗?

当然,我有一个解决方案——为了让它工作,我需要遍历cachedItems,当新项目包含相同的id时,我更新cachedItem,然后我applySnapshot没有动画,然后我终于可以applySnapshot和动画删除/插入/订购动画。

但是这个解决方案似乎更像是一个黑客而不是一个有效的代码。有没有更清洁的方法来实现这一目标?

更新:

有显示问题的代码。它应该在操场上工作。例如。items 和 newItems 包含 id == 0 的 viewModel。哈希是相同的,所以 diffableDataSource 应该重新加载,因为字幕不同。但是有可见的删除/插入而不是重新加载

0 投票
1 回答
885 浏览

ios - How can a diffable collection view display the same item in multiple sections?

My app presents an emoji keyboard like Apple's where the emoji are displayed by-category. I render this using a collection view where the categories are sections. If an emoji has been inserted recently, it should appear in the "Frequently Used" category as well as whatever category it's normally in.

This is a problem for me trying to convert my collection view to use a UICollectionViewDiffableDataSource, because NSDiffableDataSourceSnapshot requires that items are unique. If I do something like

I get warnings like

inserted identifier(s) already present; existing items will be moved into place for this current insertion. Please note this will impact performance if items are not unique when inserted.

And the emoji only shows up in one section, not both. How can I insert the item into multiple sections?

0 投票
0 回答
294 浏览

ios - 错误域=NSCocoaErrorDomain 代码=134030 “保存时发生错误。” 尝试通过 UITableViewDiffableDataSource 删除核心数据对象时

我正在尝试做的事情:

我正在尝试学习如何将 Core Data 与 NSFetchedResultsController 和 UITableViewDiffableDataSource 结合起来,以创建一个简单的表 UI,它可以平滑地处理对 Core Data 中项目表的添加和删除。

我首先构建了一些核心数据代码,然后我添加了一个 TableView,首先将它与手动提取挂钩,然后移动到 NSFetchedResultsController,使用“旧”批量更新行为,现在我正在将该代码移动到使用 DiffableDataSource。

错误:

我有两个用于删除核心数据存储中项目的功能。通过包含删除所有按钮的秘密菜单(通过摇动访问),或通过经典的滑动删除手势。

使用删除所有按钮似乎永远不会出错,但大约 50% 的时间是滑动删除。

错误信息如下:

编辑:我进一步缩小了错误条件。

该错误仅在我尝试删除最近创建的对象时才会发生。

也就是说,创建一个新的笔记,然后删除相同的笔记。

如果我创建两个笔记,然后删除第一个创建的,我不会出错。删除之后,我同样可以进入并删除第二个注释,没有任何错误。

同样,如果我创建一个便笺,停止模拟器,然后重新启动它,从 Core Data 加载便笺,我可以毫无问题地删除该便笺。

我试过的:

基于错误仅使用滑动删除发生的事实,我认为问题可能与 UITableViewDiffableDataSource 相关,它仍然具有低于标准的文档。

我尝试使用 SQL 查看器(Liya)检查我的核心数据数据库,数据库似乎有我期望的记录,我看到它们被正确创建和删除,同时使用我的调试菜单创建 1 或 1000 条记录,删除使用调试菜单的所有记录也看起来正确。

我启用了-com.apple.CoreData.SQLDebug 1参数,以查看 SQL 输出。同样,插入和删除似乎工作正常。除非发生错误。

我也尝试使用调试器并逐步解决问题,尽管出于某种奇怪的原因,似乎frame variable在我的断点(函数的开头tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool)使用 lldb 命令会导致断点失败,并且代码只是继续到错误。

编码:

这是我认为是相关代码的摘录,完整的源代码也可以在https://github.com/Hanse00/Noter/tree/master/Noter/Noter获得。我将不胜感激任何帮助理解这个问题。

ViewController.swift

注意+CoreDataClass.swift

注意+CoreDataProperties.swift

谢谢!

0 投票
2 回答
326 浏览

swift - 获取“NSInternalInconsistencyException”,原因:“无效的第 0 节。” 在多个部分进行搜索时

在多个部分进行搜索时出现异常。在数据源上应用快照时会发生这种情况。

背景:我有(预定义的)部分,每个部分都有一个项目集合。如果节中没有项目,节将不会出现在 viewController 中。通过应用程序的功能添加项目。在其中一个部分中添加项目后,将调用数据源更新并将显示添加了该项目的部分。

问题:尝试两次搜索不存在的项目时遇到此问题。要重现,您可以输入一个不存在的项目,然后通过退格删除搜索字符串,然后再次输入一个不存在的项目,然后 dataSource.apply() 将抛出错误。

希望有人可以提供帮助。蒂亚!

这是代码:

0 投票
1 回答
46 浏览

swift - tvOS 13 DiffableDataSource 无效参数不满足:itemCount

启动我的 tvOS 应用程序时,我遇到了与 DiffableDataSource: 相关的崩溃Thread 1: Expection: "Invalid parameter not satisfying: itemCount"

它在线上发生dataSource.apply(snapshot)

当试图在 Xcode 12 beta 4 上运行它时,我遇到了以下崩溃:

哪个更详细,但仍然没有提供有关为什么会发生这种情况的信息。

相同的代码在 iOS 上运行良好。

为什么会发生这种情况?

0 投票
0 回答
159 浏览

swift - 使用 UITableViewDiffableDataSource 使用分页和下拉刷新

我有UITableViewController它支持分页和拉刷新。

我试图了解正确的处理方式

  1. 替换所有数据 -拉动刷新
  2. 追加新项目 -分页

我有一个如下所示的更新方法。

当数据从拉取刷新或第一次加载时,refresh标志为true并且在分页更新时为false

我不确定这是否正确。

我正在刷新、附加部分、添加项目和应用时创建一个新的空快照。

在分页时,我正在抓取现有的数据源快照并将我的项目添加到末尾。

这是正确使用dataSource.snapshot()还是实际上可以每次都简单地附加到空快照?

0 投票
1 回答
137 浏览

ios - 带有 NotificationCenter 和 TabBarController 的 UICollectionView 可区分数据源

我有 2 个嵌入 TabBarViewController 的 UICollectionView 控制器(客户可以看到所有产品的店面和可以 CRUD 项目的后端)。两个视图控制器都有单独的数据源(最初它们包括相同的项目,在我的例子中是具有“名称”和“价格”属性的对象)来填充它们。

这个想法很简单:假设我单击后端 VC 中的一个单元格,详细 VC 以模态方式呈现,我编辑对象的一些属性并确认更改。我想要的是对对象的更改对后端 VC 和店面 VC 都是可见的。

我想到的第一件事是实现 NotificationCenter 以将更改从 Detail VC 广播到 Backend 和 Storefront,但事情是这样的:当我在 Backend VC 中收到项目并调用snapshot.reloadItems时,一切都很好,因为该项目属于 Backend VC数据源,但是当 Storefront VC 收到相同的项目时,我收到以下错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:indexPath || 忽略InvalidItems'。

我知道 diffable 数据源基于项目是否相同的想法,所以当我将项目从后端的数据源传递到 Storefront 的数据源时,Storefront 的数据源不知道如何实现snapshot.reloadItems因为它没有首先拥有具有适当 id 的项目。

任何想法如何使用 diffable 数据源和 NotificationCenter 来实现上述内容?还是有什么其他方法?

我考虑过为 Storefront 和 Backend 提供共享数据源,但不确定这样做是否合理以及将来是否会带来麻烦。

0 投票
0 回答
673 浏览

ios - 具有估计高度的 CollectionView 组合布局仅显示 _UICollectionViewOrthogonalScrollerEmbeddedScrollView

我有一个复杂的布局,大部分时间它加载得很好。重新加载几次后,虽然一切都消失了(这并不总是发生),我只看到一个空的 collectionView。如果我检查它,我可以看到只有空空间和多个 _UICollectionViewOrthogonalScrollerEmbeddedScrollView (可以看到下面的布局检查器)。

控制台中的唯一警告与项目插图有关,但我不确定它是否甚至相关,因为插图不适用于具有垂直滚动的组合 collectionView,但我认为它不会导致其他问题那。即使 collectionView 显示正常,警告仍然存在。

当问题发生时,collectionView 设置正确,甚至检查它,您可以看到节和行的数量设置正确。如果我在单元格被填充的位置放置一个断点,尽管它没有被调用。

在此处输入图像描述

在此处输入图像描述

部分布局示例:

数据设置代码示例:

0 投票
1 回答
797 浏览

ios - Diffable 数据源 - 重新加载标题

UICollectionViewDiffableDataSource可以重新加载标头的方式有哪些?

我有一个带有显示用户详细信息的标题和显示帖子的行的集合视图,模型是

当我通过快照更改属性时

行重新加载,但补充标题不会。我可以更改标题的唯一方法是,如果我将 Section 作为模型的一部分,那么:

我的应用快照现在变成

然后我分别设置用户

并且标题重新加载。

我不太明白为什么当我在 postUsers 中更改某些内容时,行会重新加载,但标题不会 - 直到我将模型作为部分的一部分实现?

我确实知道 diffable 可以用于散列,因此当我更改属性时,表会重新加载,但感觉标题也应该重新加载,但它是单独处理的吗?