iOS17下NSBatchInsert无法处理CoreData中Dictionary类型的Transformable属性
CoreData NSBatchInsert与Dictionary<String, String>可转换属性的iOS17兼容性问题
问题核心
- 使用CoreData的可转换(Transformable)属性存储
Dictionary<String, String>时,NSBatchInsert请求无法完成数据导入 - 自定义
NSSecureUnarchiveFromData转换器处理[String]类型可正常工作,但处理Dictionary<String, String>时完全失效 - 该配置在iOS16及更早版本可正常运行,Xcode15 RC及更早版本均存在此问题
错误表现
无论待插入数据量是2条还是1000条,都会触发以下错误警告:
69.635 HALC_ProxyIOContext.cpp:1.329 HALC_ProxyIOContext::IOWorkLoop: skipping cycle due to overload
问题根源明确指向可转换属性中的Dictionary<String, String>类型,且仅在NSBatchInsertRequest结合该属性时出现。
约束条件
老用户的已有数据已采用此格式存储,必须保留现有CoreData模型配置。手动通过Object(context: ...)创建托管对象虽能完成数据导入,但在处理大数据集时速度过慢,无法满足性能需求。
配置说明
- 失效配置:CoreData模型内,目标属性类型设为Transformable,自定义转换器选择
NSSecureUnarchiveFromData,指定对应的类为Dictionary<String, String> - 可工作对比配置:相同转换器设置下,若属性类型为
[String]则可正常完成批量插入(此配置无法作为解决方案,因为不符合现有数据结构)
代码场景
执行NSBatchInsertRequest的逻辑为:构造包含待插入数据的字典数组,配置批量插入请求并在上下文执行,该逻辑在iOS17及以上环境下失效。
相关信息
- 存在可复现问题的Demo项目
- 已向Apple官方提交反馈(反馈编号:13158129)
内容的提问来源于stack exchange,提问作者NilsBerni
相关产品推荐
相关产品推荐

