0

所以我有两个视图控制器。视图控制器 A 连接到视图控制器 B。在视图控制器 A 的 prepareForSegue 中,它创建了一个新的托管对象上下文并将我的全局 UIManagedDocument 上下文分配为父上下文。然后,我使用子上下文创建一个新的托管对象,并将其分配给视图控制器 B 的强属性。

一旦 viewDidLoad 在视图控制器 B 中完成,托管对象仍然有效(这是我所期望的),但是这个新对象的托管对象上下文设置为零。

我知道下面的变量 *context 在 prepareForSegue 结束时超出了范围,但我希望全局父上下文保留子上下文,或者托管对象保留上下文本身。

这是我在视图控制器 A 中的 prepareForSegue 代码的略微修改版本。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vc = segue.destinationViewController;

    if ([vc isKindOfClass:[ViewControllerB class]]) {

        // Create new context and assign its parent
        NSManagedObjectContext *mainContext = [myGlobalUIManagedDocument managedObjectContext];
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        context.parentContext = mainContext;

        // Create new managed object using the context
        NSManagedObject *objectB = [NSEntityDescription insertNewObjectForEntityForName:@"ObjectB" inManagedObjectContext:context];

        // Pass the object to the destination view controller
        ViewControllerB *vcB = (ViewControllerB *)vc;
        vcB.strongManagedObjectProperty = objectB;
    }
}

现在据我所知,视图控制器 B 中的任何代码都没有将上下文设置为 nil。我只是想知道,如果根据我提供的信息,一旦 prepareForSegue 失去作用域,*objectB 的托管对象上下文仍应为非零如果是这样,我似乎还有更多的调试要做。

更新:我能够在视图控制器 B 中的 viewWillAppear 之后和 viewDidAppear 之前的某个时间跟踪我的上下文设置为 nil 的确切时刻。我完全糊涂了。

4

1 回答 1

0

我从来没有真正弄清楚这里发生了什么。

我的解决方案是在我的名为 editingContext 的单例类上创建一个 UIManagedObjectContext 属性来管理我的 UIManagedDocument。它负责创建一个上下文作为 UIManagedDocument 主上下文的子级,并将其存储在自己的属性中。

因此,每当我将上下文传递给视图控制器 B 时,上下文不会设置为 nil。当我完成上下文后,我只需向我的单例发送一个 checkinContext: 方法以释放编辑上下文。

有点骇人听闻,但我可以将这种方法与我所有的 segues 一起使用,并获得一个“临时”上下文的好处,如果用户取消他们的操作,我可以丢弃它。

于 2013-02-21T14:36:39.447 回答