如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?
Posted
技术标签:
【中文标题】如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?【英文标题】:How to access NSManagedObject entity using objectID which is not saved yet in iOS? 【发布时间】:2016-03-18 11:26:43 【问题描述】:我使用私有队列 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
查看时,我可以看到这个新联系人保存在数据库中
请原谅我的代码缩进:(
【问题讨论】:
请出示您的代码 :) @kishor : 看看代码 【参考方案1】:你问的是不可能的。
当您在一个上下文中创建托管对象时,它只存在于内存中,直到您保存更改。即使您使用对象 ID,其他托管对象上下文也无法访问它。其他上下文无法从持久存储文件中查找数据,也无法从其他上下文中获取数据。它根本无法获取对象。您需要等到保存完成。
您可以尝试以下几种方法,具体取决于您的应用的结构:
使用performBlockAndWait
而不是performBlock
,这样您就会知道在块完成时保存已完成。
继续使用 performBlock
,但将调用放在该块内,这会导致在不同的上下文中访问对象 - 通过在另一个上下文中的嵌套 performBlock
调用。
【讨论】:
感谢@tom!我使用“performBlockAndWait”同步保存数据库,效果很好以上是关于如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?的主要内容,如果未能解决你的问题,请参考以下文章
如何查找CDHDR/CDPOS表中的对象类(OBJECTCLAS)对象值(OBJECTID)
在 mongoose 中保存时使用 ObjectId 参考文档