NSBatchInsert 不适用于 CoreData 可转换属性,例如字典<String, String>

问题描述 投票:0回答:1

在可转换核心数据属性中使用字典时,CoreData 不会导入数据。我将附上设置和项目的屏幕截图。使用像 [String] 这样的自定义 NSSecureUnarchiveFromData 可以工作,但 Dictionary 不起作用。词典在iOS16及之前版本下完美运行。我遇到这个问题已经有一段时间了。我目前正在 Xcode15 RC 下进行测试,但早期版本也存在问题。错误警告为:69.635 HALC_ProxyIOContext.cpp:1.329 HALC_ProxyIOContext::IOWorkLoop:由于过载而跳过周期。两个条目发生的错误与 1000 个条目发生的错误类似。原因是可变形中的字典。

仅当与 NSBatchInsert 请求中的字典结合使用时才会出现此问题。不幸的是,我有必要保留此配置,因为老用户的数据以该格式存储。创建像 Object(context: ...) 这样的 ManagedObjects 是可行的,但对于大数据集来说会变慢。

这是一个重现该错误的演示项目:https://github.com/NilsBerni/NSBatchInsertIos17Bug

https://feedbackassistant.apple.com/feedback/13158129

swift core-data swift5 ios17 xcode15
1个回答
0
投票

您在 NSBatchInsert 和可转换属性(特别是字典方面)面临的问题是 iOS 17 (Xcode 15) 中的一个已知错误。当尝试导入带有字典作为可转换属性的数据时,此错误会导致 NSBatchInsert 失败。

不幸的是,这个错误没有直接的解决方法。但是,您可以考虑一些替代方法:

  1. 使用不同的数据类型:除了使用字典之外,您还可以考虑使用 Core Data 支持的其他数据类型,例如 NSData 或 NSSet。您可以将字典序列化为 NSData,然后再将其保存到可转换属性。

  2. 将字典拆分为单独的属性:如果可能,您可以在核心数据模型中将字典拆分为单独的属性。例如,如果您的字典具有键“key1”和“key2”,您可以在实体中创建两个单独的属性“attribute1”和“attribute2”,并将字典中的相应值存储在这些属性中。

  3. 使用单独的实体:您可以创建一个单独的实体来表示字典,而不是使用可转换属性。该实体可以有两个属性,“键”和“值”,您可以在主实体和该字典实体之间创建一对多关系。这样,您可以将每个键值对存储为单独的对象。

  4. 等待错误修复:您可以关注Apple的错误跟踪器和开发者论坛以获取有关此问题的任何更新。 Apple 可能会在未来版本的 iOS 中解决此错误。

同时,如果导入大型数据集时需要考虑性能,您可以考虑使用其他方法,例如 NSBatchUpdateRequest 或使用多个 NSBatchInsert 请求小批量导入数据。

还值得一提的是,您可以通过您分享的反馈助手链接向 Apple 提供反馈。这有助于引起人们对问题的关注,并增加在未来更新中解决该问题的机会。

祝你好运!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.