我已经在iOS应用程序中与临时核心数据对象进行了几个月的摔跤。我使用的UIManagedDocument可能会或可能不会使事情变得复杂。我遇到的问题是当视图在状态编码期间尝试保存对象的URI以进行恢复时,每当新创建的对象具有对象ID是临时ID时,我就会遇到问题。
之前我试图用以下方法强制保存UIManagedDocument
NSError *saveError=nil;
BOOL bSuccess=[document.managedObjectContext save:&saveError];
[document updateChangeCount:UIDocumentChangeDone];
[document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil)
我认为这有助于修复临时的objectID,它肯定会强制保存到存储/磁盘(使用更自动化的UIManagedDocument时不应该这样做),但我发现新创建的对象ID&# 39;即使在此之后,document.managedObjectContext仍然留有临时ObjectID。
昨晚我发现在savePresentedItemChangesWithCompletionHandler的完成处理程序块中发生了保存之后进行的以下强力添加似乎能够修复我仍然遇到的临时ObjectID。
[document.managedObjectContext reset];
这可能会丢弃整个上下文,并强制在保存完成后使用新的永久ID刷新所有内容。我认为这至少需要某种形式的SQL db从磁盘重新加载,因此并不是一个理想的解决方案。
最后我发现可能有另一个解决方案,一个不需要在UIManagedDocument上节省强力的解决方案,而是在任何新创建的NSManagedObject上执行以下操作
NSError *obtainError=nil;
BOOL bObtainSuccess = [object.managedObjectContext obtainPermanentIDsForObjects:@[object] error:&obtainError];
我确实认为这似乎是在锡上写的。如果我测试对象的临时性,即使只是大约一秒左右,那么它似乎清理并发现所有对象都被处理为永久对象。但是,如果我在调用obtainPermanentIDsForObjects之后尝试测试它们是否会立即永久化,如下所示
NSError *obtainError=nil;
BOOL bObtainSuccess = [object.managedObjectContext obtainPermanentIDsForObjects:@[object] error:&obtainError];
assert(![[object objectID] isTemporaryID]);
然后断言发射,即。即使obtainPermanentIDsForObjects方法返回YES,对象仍然有一个临时ID,并将obtainError保留为nil。
这一切都是在主线程上完成的,没有任何上下文执行块。给定UIManagedDocument的配置,虽然这应该是正确的,我想。
有没有人对此有任何想法?现在希望看起来没关系,如果我不立即检查,几乎就像有一些线程进行操作,这确实让我想知道它是否应该在某个不同的线程上完成......
感谢您的时间