我使用私有队列MOC创建了一个实体,并调用performBlock()
来异步保存它。
假设我想在其他上下文/ MOC中使用这个新创建的实体,所以我只有一种方法可以访问它是使用对象ID。
但由于它是对保存实体的异步调用,因此可能存在尚未保存实体的情况,我希望在performBlock()
之后立即访问它,但在其他情况下。
在这种情况下访问它的方法是什么?
提前致谢!
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = mainThreadManagedObjectContext()
let newUser = Contact(nameStr: "name", moc: privateMOC)
这是我创建新实体的通用代码,如:
init(nameStr: String, moc:NSManagedObjectContext) {
let mEntity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: moc)
super.init(entity: mEntity!, insertIntoManagedObjectContext: moc)
name = nameStr
}
创建后,我立即将其保存为:
performBlock { () -> Void in
do {
try privateMOC.save()
}catch {
fatalError("Error asynchronously saving private moc - \(errorMsg): \(error)")
}
}
//访问
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = mainThreadManagedObjectContext()
let pred = NSPredicate(format: "name == %@", "name")
if let results = DatabaseInterface.sharedInstance.fetchEntityFromCollection("Contact", withPredicate: pred, moc: privateMOC) {
if let user = results.last {
return user as! Contact
}
}
else {
DDLogWarn("No user found")
}
我没有收到任何用户,但在使用sqlitebrowser
原谅我代码缩进:(
答案 0 :(得分:0)
你提出的问题是不可能的。
在一个上下文中创建托管对象时,它只存在于内存中,直到您保存更改。即使您使用对象ID,也没有其他托管对象上下文可以访问它。另一个上下文无法从持久性存储文件中查找数据,也无法从其他上下文中获取数据。它根本无法获得对象。您需要等到保存完成。
您可能会尝试一些事情,具体取决于您的应用的结构:
performBlockAndWait
代替performBlock
,以便您知道在阻止完成时保存已完成。performBlock
,但在该块中调用导致访问不同上下文对象的调用 - 通过对其他上下文的嵌套performBlock
调用。