跨视图控制器保持子上下文

Posted

技术标签:

【中文标题】跨视图控制器保持子上下文【英文标题】:keeping around a child context across view controllers 【发布时间】:2013-09-28 03:30:44 【问题描述】:

我四处寻找人们如何使用核心数据进行添加和编辑。我看到了 WWDC 2012 - 214 视频以及这篇文章:http://www.cocoanetics.com/2012/07/multi-context-coredata/,它谈到了与父母一起使用子上下文。我的问题是,如果我需要在一个 ViewController 上创建一个临时对象,然后将该临时对象传递给几个 viewController 的深处,直到我决定是否要保存,该怎么办。然后我需要通过 viewControllers 将 tempContext 传递给我吗?或者我只需要将 NSManagedObject 传递给其他 viewControllers 并且 tempContext 是方法的局部变量并不重要。例如:

ViewController 1 会:

@property (nonatomic, strong) Route *route; // NSManagedObject subclass
@property (nonatomic, strong) NSManagedObjectContext *mainMoc;
- (void)calculateRoute 
NSMangedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
temporaryContext.parentContext = self.mainMOC;
  // calculate the route to possibly save at least one viewController deep
  self.route = route;



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
UIViewController *destination = [segue destinationViewController];

if ([segue.identifier isEqualToString:@"ShowDistanceViewController"]) 

    if ([destination respondsToSelector:@selector(setManagedObjectContext:)]) 
        [destination setValue:self.managedObjectContext forKey:@"managedObjectContext"];
    
    if ([destination respondsToSelector:@selector(setRoute:)]) 
        [destination setValue:self.route forKey:@"route"];
    
 

现在在destinationViewController中,此时我该如何丢弃和/或保存它?

【问题讨论】:

【参考方案1】:

只需传递对象。您可以使用

从对象访问上下文(无论是子对象还是主对象)
object.managedObjectContext

【讨论】:

所以上下文消失并仅在创建对象的方法的本地并不重要?即使它不是 ivar 或其他东西,我仍然可以传递对象并且仍然可以访问临时上下文? 是的,完全正确。如前所述,您可以从对象中获取上下文。 嗯,好像不是这样。一旦 tempContext 失去作用域,即使我有 NSManagedObject,managedObjectContext 属性也是 null。 如果你的上下文超出范围,对象怎么可能不在?这可能需要检查您的应用程序逻辑。如果你的上下文范围结束,你不应该再与它的对象交互。在处理托管对象时,您应该有一个有效的上下文:例如通过从应用程序委托获取它并获取您的对象。

以上是关于跨视图控制器保持子上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何控制子视图的大小和布局?

添加为子视图的 NSView 不显示

为 segue 中传递的新 nsmanagedobject 释放分配的上下文

我应该在子视图模型中存储对父视图模型的引用吗?

在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景

核心数据 - 管理上下文