【发布时间】:2020-12-31 17:11:17
【问题描述】:
我有两个实体,User 和 Post。一个User 包含许多Post,而每个Post 只有一个User。
我正在尝试批量插入超过 1000 个帖子。
private func newBatchInsertRequest(with posts: [PostData]) -> NSBatchInsertRequest {
var index = 0
let total = posts.count
let batchInsert = NSBatchInsertRequest(entity: Post.entity()) { (managedObject: NSManagedObject) -> Bool in
guard index < total else { return true }
if let post = managedObject as? Post {
let data = posts[index]
post.createdData = data.createdDate
post.identifier = data.identifier
post.text = data.text
}
index += 1
return false
}
PersistenceController.shared.container.performBackgroundTask { context in
try? context.execute(batchInsert)
try? context.save()
}
}
它会插入我想要插入的所有帖子。但是,我无法配置如何设置他们的User。
我尝试使用以下代码,但没有成功。
let updateRequest = NSBatchUpdateRequest(entity: Post.entity())
updateRequest.resultType = .updatedObjectIDsResultType
updateRequest.propertiesToUpdate = ["user": user]
try? context.execute(updateRequest)
我收到以下错误。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid relationship ((<NSRelationshipDescription: 0x2801045a0>), name item, isOptional 1, isTransient 0, entity Post, renamingIdentifier item
我可以一一设置他们的用户,但是处理时间长,效率低。
如何更高效地更新 Posts 的用户属性?
更新
所有这些帖子都属于一个User,它还不存在。我需要在执行NSBatchInsertRequest之前或之后创建它。
User 具有三个属性
1. createdDate: Date
2. identifier: UUID
3. name: String
我的目标是使用NSBatchInsertRequest 或在私有上下文中插入属于一个使用的帖子,这样它就不会阻塞主线程。
【问题讨论】:
-
不清楚您如何确定应该将哪个用户连接到帖子?
-
那为什么不先创建用户,然后分配给newBatchInsertRequest中的帖子呢?
-
他们有不同的上下文。在核心数据中,绑定到一个上下文的对象不能在另一个上下文中使用。 @JoakimDanielson