在我的iOS应用程序中,我正在使用Core进行一个获取,并删除一个非常大的数据集。这个过程大约需要5-10秒。我想做的是执行回滚,以防用户决定在进程完成之前关闭设备。但是,问题是有相同的NSManagedObjectContext实例来从适当的AppDelegate方法调用回滚函数。在我的应用程序中,我使用一个Singleton对象调用我的Core数据方法,如下所示:
static MySingleton *sharedSingleton = nil;
+ (MySingleton *) sharedInstance {
if (sharedSingleton == nil) {
sharedSingleton = [[super alloc] init];
}
return sharedSingleton;
}在我的应用程序中,我返回一个NSManagedObjectContext实例,如下所示:
- (NSManagedObjectContext *) managedObjectContext{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
//Undo Support
NSUndoManager *anUndoManager = [[NSUndoManager alloc] init];
[self.managedObjectContext setUndoManager:anUndoManager];
}
return _managedObjectContext;
}然后我调用它,并将它分配给如下引用:
NSManagedObjectContext *context = [[MySingleton sharedInstance] managedObjectContext];如何使ManagedObjectContext的这个实例可供我在AppDelegate中使用,以便我可以调用回滚函数?
发布于 2015-02-12 21:55:56
首先,创建单例的更好(更安全)的方法如下所示:一次进入目标C,即:
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}接下来,由于您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强烈引用,这就是您所做的。
如果您正在进行调试,并且正在对代码的一些基本假设提出疑问,请给托管对象上下文一个名称(或记录MOC指针的内存地址),稍后您可以在调试器中检查这个名称,以验证您确实在处理同一个对象。
还请注意,如果只为这种导入创建了专用的托管对象上下文,则不需要回滚它。你可以直接抛弃它。
在我的应用程序中,我通常有一个父(根)托管对象上下文和几个子上下文;一个子线程用于主线程,另一个子上下文用于导入类型操作。
发布于 2015-02-12 21:55:19
作为另一种解决方案,您可以创建一个多上下文场景,在该场景中,子托管对象上下文添加所需的所有数据,并在完成后保存发送新数据到主托管对象的子上下文,而不是回滚更改。这样,在完成整个过程之前,主托管对象上下文才会受到影响。
这是一篇很棒的文章,作为参考多上下文CoreData。
基本上你需要做的是
// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
// create child MOC
_childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_childContext.parentContext = _mainContext;希望能帮上忙。
https://stackoverflow.com/questions/28486402
复制相似问题