在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据

Posted

技术标签:

【中文标题】在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据【英文标题】:Saving Context At a Later Stage - Saving Pointer To Context ? Core Data 【发布时间】:2013-10-01 10:05:53 【问题描述】:

我有以下代码将新实体插入核心数据模型(通过 Magical Record):

- (void)insertWithData:(NSDictionary *)dataDictionary 

DLog(@"Inserting %@", [_entityClass description]);

NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];

id entity = [_entityClass createInContext:context];

[entity setValuesFromDictionary:dataDictionary];

if ([entity isKindOfClass:[Syncable class]]) 
    [entity setValue:YesNumber forKey:@"syncedToServer"];


[context save];

由于此代码在从另一个类调用的 FOR 循环中多次运行,我只想在循环完成后保存上下文以优化性能。

我的问题是最好的方法是什么?我应该在此处保存对上下文的引用(例如在应用程序委托中),然后在调用类中使用此引用保存吗?或者我可以在调用类中再次调用 NSManagedObjectContext contextForCurrent Thread 并使用此引用 - 即在调用类中:

NSManagedObjectContext * context = [NSManagedObjectContext contextForCurrentThread];
[context save];

【问题讨论】:

【参考方案1】:

您可以通过以下方式执行此操作:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
    // your for loop
];

请阅读http://saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/,了解有关为什么不应该使用 contextForCurrentThread 的更多信息。

【讨论】:

【参考方案2】:

如果您想在循环结束时保存,我建议您将 NSManagedObjectContext 作为参数传入:

- (void) insertData:(id)data inContext:(NSManagedObjectContext *)context;

   //do all your data stuff here.


你会这样使用它:

NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];
for (id obj in objCollection)

   [self insertData:obj inContext:context];

[context MR_save];

【讨论】:

【参考方案3】:

是的,您可以在循环后保存上下文。这比在每次迭代中保存要好得多。如果您查看 MagicalRecord src,您会看到 MR_contextForCurrentThread 总是为相同的线程返回相同的上下文,如果没有线程 MagicalRecord 创建它的上下文。 此外,您不需要传递上下文 [_entityClass createInContext:context],只需 [_entityClass MR_createEntity] - 它将在当前线程的上下文中创建

【讨论】:

对不起,这是错误的。首先,contextForCurrentThread 现在已被弃用。它已经在 MagicalRecord 3.0 中被删除,所以现在是时候习惯不使用它了。您可以指定上下文,但您应该使用限制上下文,并将默认上下文设置为父上下文,或者让它观察新上下文中的更改,并在保存时将其合并。

以上是关于在稍后阶段保存上下文 - 保存指向上下文的指针?核心数据的主要内容,如果未能解决你的问题,请参考以下文章

帧栈结构

保存托管对象上下文会在 iOS 5 的 performBlock 中创建死锁

SQL Server游标

libgo 源码剖析(3. libgo上下文切换实现)

JS执行上下文

JS闭包