问题标签 [nsdiffabledatasourcesnapshot]
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.
ios - NSDiffableDataSourceSnapshot `reloadItems` 有什么用?
我很难找到 NSDiffableDataSourceSnapshot 的用途reloadItems(_:)
:
如果我要求重新加载的项目与数据源中已经存在的项目不相等,我会崩溃:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试重新加载快照中不存在的项目标识符:ProjectName.ClassName
但是,如果该项目等同于数据源中已经存在的项目,那么“重新加载”它的意义何在?
您可能会认为第二点的答案是:嗯,项目标识符对象的某些其他方面可能不是其等价性的一部分,但确实反映到单元格界面中。但我发现那不是真的。调用后reloadItems
,表视图不反映更改。
因此,当我想更改一个项目时,我最终对快照所做的是insert
要替换的项目之后,然后是delete
原始项目的 a。没有快照replace
方法,这正是我希望reloadItems
的结果。
reloadItems
(我对这些术语进行了Stack Overflow 搜索,但发现的很少——主要是几个对. ,有人发现这种方法有什么实际用途?)
好吧,没有什么比拥有一个可重复的最小示例更可取的了,所以这里有一个。
使用模板 ViewController 制作一个普通的 iOS 项目,并将此代码添加到 ViewController。
我一块一块来。首先,我们有一个结构将用作我们的项目标识符。UUID 是唯一的部分,因此等价性和哈希性仅取决于它:
接下来,(假)表视图和可区分的数据源:
所以在我们的 diffable 数据源中只有一个 UniBool 并且它bool
是true
. 所以现在设置一个按钮来调用这个操作方法,它试图bool
通过使用来切换值reloadItems
:
事情就是这样。我对reloadItems
一个 UUID 匹配但bool
被切换的项目说:“这个对象的 isON 是假的”。但是当我问快照时,好吧,你有什么?它告诉我它唯一的项目标识符bool
仍然是 true。
这就是我要问的。如果快照不会获取 的新值bool
,那么首先是reloadItems
为了什么?
显然,我可以只替换一个不同的UniBool,即一个具有不同 UUID 的 UniBool。但是我不能打电话reloadItems
;我们崩溃是因为 UniBool 还没有在数据中。我可以通过调用来解决这个问题insert
,remove
这正是我解决它的方法。
但我的问题是:reloadItems
如果不是为了这件事,那又是为了什么?
ios - UICollectionView - 部分快照 - 删除部分或项目时“找不到项目索引”
我想创建一个collectionView
也可以折叠的动态部分。使用 iOS 14中的新功能,这似乎很容易section snapshots
。这就是我所拥有的(完全工作的示例)。
这只是一个简单的集合视图,显示几个部分,每个部分有 4 个项目。为了演示我的问题,我添加了一个在加载视图控制器 2 秒后自动调用的闭包。它删除了第一部分并更新了 collectionview 的数据源。
有两个问题:
首先,它给了我这些错误信息:
其次,更新在视觉上并不好,因为它重新加载了整个集合视图(所有单元格都在交叉淡入淡出,即使它们没有改变)。
错误是在applySnapshot()
方法内部引起的:
这会将这些部分应用于数据源(Apple 在他们的示例项目中也是如此)。
如果我将此行注释掉,则这些部分将不再更新(在此示例中,已删除的部分将保留在集合视图中。
有任何想法吗?我做错了吗?section snapshots
不打算与动态内容一起使用吗?如果是这样,是否有另一种简单的方法来拥有可折叠的部分?
谢谢!
ios - 在动画中应用具有相同数据结果的 NSDiffableDataSourceSnapshot
我有一个带有 UITableViewDiffableDataSource 的 UITableView,我在其中支持刷新和分页。当我创建具有相同数据的新快照并应用该快照时,它会产生一个奇怪的动画,其中前几个元素向上滑动,而具有相同数据的新元素从左侧滑入。这是更新的片段:
当数据没有改变时,应用与前一个内容相同的新快照不应该产生任何动画?我用新内容检查了现有内容的哈希值,它们都是一样的。
此外,我有一个无限滚动,可以按 10 个项目加载 10 个项目。当我向下滚动并加载下一页时,现有数据附加了 10 个项目。我创建了一个新快照并将其应用于数据源,这再次导致一个奇怪的动画和我的表格视图跳到顶部。
在更改之间,创建了新对象,但它们具有相同的散列,因此它不应该影响表的刷新,对吧?
有谁知道什么可能导致表格视图认为现有内容已经改变,尽管它没有?我发现的关于数据源如何进行差异的唯一信息是它检查每个部分和项目的哈希值。
ios - 如何使用 Diffable Data Source 和 NSFetchedResultsController 处理 CRUD 操作
我有一个简单的 4 行产品商店屏幕,每行包含 4-5 个产品。
目前我有以下设置
- 控制器调用后端服务器并获取数据
- 将模型保存到 Core Data
- 这会触发 NSFetchedResultsController 的更新
- 使用 Diffable Data Source 应用新快照
当新产品添加到任何行或以某种方式更新时,此设置非常有用。
但是我无法找到一种方法来处理在 API 响应中删除产品时如何处理这种情况?因为每当我收到响应时,我都会将其保存在核心数据库中,然后依靠 FRC 触发器来应用快照。
因此,如果在响应中删除了现有产品,该产品仍会继续显示在商店中,因为它也需要在数据库中删除。因此,在保存到数据库之前,我总是必须删除所有现有数据,然后保存新数据以使更改生效。
任何人都可以建议更改我的设置以处理这种情况或任何特定的流程来处理它吗?
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
,最终用于配置单元格。
uitableview - 将 NSDiffableDataSourceSnapshot 应用于 UITableViewDiffableDataSource 导致“NSInternalInconsistencyException”
我正在尝试为我的 tableview 实现 UITableViewViewDiffableDataSource。我的代码编译得很好,但是我第一次对其应用快照时一直遇到此错误,并出现以下错误:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:section < [_state.dataSourceSnapshot numberOfSections]”
这是我的代码:
BaseDisplayManager
可区分部分
BaseDiffableDataSource
}
swift - 在 UITableViewDiffableDataSource 上使用 apply() 后如何访问受影响的 IndexPaths
调用 UITableViewDiffableDataSource?.apply() 后是否有任何内置方法可以确定受影响的索引路径?
即更新类型的数组(添加/删除)和 indexPath 受影响?
swift - 如何以编程方式打开 Modern Collection Views 中的第一个单元格?
在使用Modern Collection Views时,我设法创建了一个自定义 UIContentView。伟大的。现在我想以编程方式打开第一个单元格/行。我该怎么做呢?这是我希望在启动时看到的。
提前感谢您的任何提示。
ios - 在集合视图中应用包含所有新数据的快照后,可区分数据源滚动到顶部
我有一个集合视图(使用组合布局和可区分的数据源),它的标题中有一个分段控件。当控制值发生变化时,单元格会更新为UICollectionViewCell
具有所有新数据的不同类。它主要按预期工作。问题是当我应用我的快照时,我的集合视图会滚动回顶部。我怎样才能让它不滚动?
当我的视图加载时调用:
当分段控件发生变化时调用:
设置我的单元格和补充视图:
ios - Swift - 实现 Hashable 和 Equatable 以及 NSObject 哈希和 isEqual 覆盖有什么区别
我正试图围绕DiffableDataSource
在 tableviews/collectionviews 中处理数据的新方法,在测试期间我遇到了一个奇怪的崩溃。我希望下面的两种实现方式完全相同:
实施1:
实施2:
但显然它们不是 -Implementation 2
与下面的代码一起使用并且Implementation 1
不使用。
运行时收到的崩溃消息Implementation 1
:
有人可以解释一下这些实现有什么区别吗?我怎样才能修复Implementation 1
与工作相同的问题Implementation 2
?