Ios 为什么不';我的NSManagedObject在[moc保存]PerformBlockAndWait之后是否仍然存在?

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

我还在做我的RSS阅读器

我的数据模型大致由以下
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(@" ... ");
        }
    }]
}];