Ios 为什么不';我的NSManagedObject在[moc保存]PerformBlockAndWait之后是否仍然存在?
我还在做我的RSS阅读器 我的数据模型大致由以下Ios 为什么不';我的NSManagedObject在[moc保存]PerformBlockAndWait之后是否仍然存在?,ios,core-data,concurrency,persistence,nsmanagedobjectcontext,Ios,Core Data,Concurrency,Persistence,Nsmanagedobjectcontext,我还在做我的RSS阅读器 我的数据模型大致由以下NSManagedObject层次结构组成: Category <---->> Feed <---->> Post 尽管如此,我无法在专用的“localMOC”中的Feeds中创建Posts: NSManagedObjectID *feedID=[f objectID]; if ([feedID isTemporaryID]) { NSLog(@"Warning %@ has not yet been
NSManagedObject
层次结构组成:
Category <---->> Feed <---->> Post
尽管如此,我无法在专用的“localMOC”中的Feed
s中创建Post
s:
NSManagedObjectID *feedID=[f objectID];
if ([feedID isTemporaryID]) {
NSLog(@"Warning %@ has not yet been persisted!", f.name);
}
/* ... */
NSManagedObjectContext *localMOC;
localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[localMOC setParentContext:self.mainMOC];
/* ... */
[localMOC performBlock:^{
NSError *error=nil;
Feed *feed=((Feed *)[localMOC existingObjectWithID:feedID error:&error]);
if (error) {
NSLog(@"[MAsterViewController::fetchPosts] %@\n%@", [error localizedDescription], [error userInfo]);
return;
}
/* ... */
上述代码位生成以下日志:
2013-11-14 19:24:04.847 uRSS[10907:70b] Warning Maddox has not yet been persisted!
2013-11-14 19:24:04.847 uRSS[10907:1303] [MAsterViewController::fetchPosts] The operation couldn’t be completed. (Cocoa error 133000.)
有人能告诉我这里出了什么问题吗?
谢谢 如果没有某种保存/更改操作,一个上下文无法访问另一个上下文“临时”(未保存)对象。
上下文是一个草稿行,在它决定通过提交保存操作共享更改之前(您也可以侦听上下文更改通知)。
在您的情况下:
main
上下文创建了一个项目(在local
上下文存在之前)。然后,您尝试从
local
上下文访问此项目,而不首先保存对象(或获取永久ID)。为了完成此类流程,您至少需要为您的对象获取一个永久ID:
[self.mainMOC obtainPermanentIDsForObjects:@[f]error:&error]
注意:
尽管
main
MOC是local
上下文的父级,但使用local
上下文的existingObjectWithID:error:
方法只能在local
上下文的注册对象中查找对象。否则,它将尝试从商店取货。获取永久ID将导致本地
上下文尝试访问存储(或父上下文)以获取对象。我通过实现自己的保存例程最终解决了问题:
[_localMOC performBlockAndWait:^{
NSError *errLoc=nil;
if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects] arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) {
NSLog(@" ... ");
}
if (![_localMOC save:&errLoc]) {
NSLog(@" ... ");
}
[_mainMOC performBlockAndWait:^{
NSError *errMain=nil;
if (![_mainMOC save:&errMain]) {
NSLog(@" ... ");
}
}]
}];
请注意,
\u mainMOC
正在从AppDelegate
观察,并将由其\u saveMOC
家长将其更改异步保存到磁盘。您好,非常感谢您的帮助。所以我猜我的多个performBlockAndWait…save
块没有任何效果?因为local
上下文没有保存,并且无法更改对象,所以没有。但是对main
上下文所做的所有更改都将被保留。
[_localMOC performBlockAndWait:^{
NSError *errLoc=nil;
if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects] arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) {
NSLog(@" ... ");
}
if (![_localMOC save:&errLoc]) {
NSLog(@" ... ");
}
[_mainMOC performBlockAndWait:^{
NSError *errMain=nil;
if (![_mainMOC save:&errMain]) {
NSLog(@" ... ");
}
}]
}];