将新的核心数据对象插入到多个 NSOrderedSet 会忽略索引

Posted

技术标签:

【中文标题】将新的核心数据对象插入到多个 NSOrderedSet 会忽略索引【英文标题】:Inserting new Core Data object to to-many NSOrderedSet ignores index 【发布时间】:2019-11-11 15:29:44 【问题描述】:

在将新的核心数据实体 (EntityB) 插入另一个实体 (EntityA) 的 NSOrderedSet 关系属性时,我遇到了一种奇怪的行为; index 被忽略,对象总是插入到有序集合的末尾。

正在插入的对象是现有对象的副本,使用的是使用自定义副本初始化程序创建的不同父实体:

// EntityA
@NSManaged var entityBs: NSOrderedSet    // to-many relationship


// EntityB
@NSManaged var entityA: EntityA?


// Inserting EntityB copy into EntityA 
let entityBCopy = EntityB(entityB: entityBOriginal, newParent: entityA)
entityA.insertIntoEntityBs(entityBCopy, at: index)

entityBs 插入前:

entity0
entity1
entity2
entity3
entity4

entityBs 在索引 2 处插入 newEntity2 后:

entity0
entity1
entity2
entity3
entity4
newEntity2    < inserted at the end of ordered set, not at index 2

我已确认indexentityBs 的内容范围内。

EntityA 使用 Core Data Generated Accessors,但我也尝试通过键值编码方法手动插入对象 - 发生同样的问题。这让我想知道这是否是 NSOrderedSet 的问题,而不是核心数据的问题。

我不知道为什么会这样,所以欢迎提供任何信息!

【问题讨论】:

请显示insertIntoEntityBs方法的代码。 @MikeTaverne insertIntoEntityBs 由 Xcode 自动生成。 【参考方案1】:

问题在于entityBCopy 的初始化,特别是newParent 参数。用父关系初始化EntityB,然后立即将EntityB 实例插入同一个父关系是多余的。 Core Data 生成的insert 方法应该处理在entityBCopy 上设置父属性,假设模型中的所有设置都正确。

因此,从初始化程序中删除 newParent 参数应该会导致在正确的索引处插入:

// Inserting EntityB copy into EntityA 
let entityBCopy = EntityB(entityB: entityBOriginal)
entityA.insertIntoEntityBs(entityBCopy, at: index)

编码愉快!

【讨论】:

这个问题是复制的全部意义在于给副本一个不同的父级(因为它的目的是源 EntityA 没有突变)。 鉴于我删除初始化器的第二个参数的更改,entityBCopy 在初始化后将有一个 nil 父级。然后,假设entityA 打算成为新的父级,调用entityA.insertIntoEntityBs(entityBCopy, at: index) 将成功地将entityA 建立为entityBCopy 的父级。 啊,我明白这里发生了什么。因为在 entityA 上调用了 insertIntoEntityBs(),所以会自动填充该实体实例。

以上是关于将新的核心数据对象插入到多个 NSOrderedSet 会忽略索引的主要内容,如果未能解决你的问题,请参考以下文章

将新数据插入核心数据存储时如何使 UICollectionView 始终位于底部

C++ 将新的类对象添加到数组中的新位置

将一个对象插入多个关系 - IOS核心数据

在核心数据中插入新的关系数据

将新的 plist 文件添加到 iOS 应用程序

在插入新的子对象时,父子对象传递与多级的一对多关系。 IOS核心数据