如何使用尚未在iOS中保存的objectID访问NSManagedObject实体?

时间:2016-03-18 11:26:44

标签: ios core-data nsmanagedobjectcontext

我使用私有队列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

查看时,我可以看到此新联系人已保存在数据库中

原谅我代码缩进:(

1 个答案:

答案 0 :(得分:0)

你提出的问题是不可能的。

在一个上下文中创建托管对象时,它只存在于内存中,直到您保存更改。即使您使用对象ID,也没有其他托管对象上下文可以访问它。另一个上下文无法从持久性存储文件中查找数据,也无法从其他上下文中获取数据。它根本无法获得对象。您需要等到保存完成。

您可能会尝试一些事情,具体取决于您的应用的结构:

  • 使用performBlockAndWait代替performBlock,以便您知道在阻止完成时保存已完成。
  • 继续使用performBlock,但在该块中调用导致访问不同上下文对象的调用 - 通过对其他上下文的嵌套performBlock调用。