首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在核心数据中从ManagedObjectContext执行回滚功能时需要访问相同的AppDelegate实例

在核心数据中从ManagedObjectContext执行回滚功能时需要访问相同的AppDelegate实例
EN

Stack Overflow用户
提问于 2015-02-12 19:43:43
回答 2查看 195关注 0票数 0

在我的iOS应用程序中,我正在使用Core进行一个获取,并删除一个非常大的数据集。这个过程大约需要5-10秒。我想做的是执行回滚,以防用户决定在进程完成之前关闭设备。但是,问题是有相同的NSManagedObjectContext实例来从适当的AppDelegate方法调用回滚函数。在我的应用程序中,我使用一个Singleton对象调用我的Core数据方法,如下所示:

代码语言:javascript
复制
static MySingleton *sharedSingleton = nil;


+ (MySingleton *) sharedInstance {

    if (sharedSingleton == nil) {
        sharedSingleton = [[super alloc] init];
    }
    return sharedSingleton;
}

在我的应用程序中,我返回一个NSManagedObjectContext实例,如下所示:

代码语言:javascript
复制
- (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;
}

然后我调用它,并将它分配给如下引用:

代码语言:javascript
复制
NSManagedObjectContext *context = [[MySingleton sharedInstance] managedObjectContext];

如何使ManagedObjectContext的这个实例可供我在AppDelegate中使用,以便我可以调用回滚函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-12 21:55:56

首先,创建单例的更好(更安全)的方法如下所示:一次进入目标C,即:

代码语言:javascript
复制
+ (instancetype)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

接下来,由于您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强烈引用,这就是您所做的。

如果您正在进行调试,并且正在对代码的一些基本假设提出疑问,请给托管对象上下文一个名称(或记录MOC指针的内存地址),稍后您可以在调试器中检查这个名称,以验证您确实在处理同一个对象。

还请注意,如果只为这种导入创建了专用的托管对象上下文,则不需要回滚它。你可以直接抛弃它。

在我的应用程序中,我通常有一个父(根)托管对象上下文和几个子上下文;一个子线程用于主线程,另一个子上下文用于导入类型操作。

票数 2
EN

Stack Overflow用户

发布于 2015-02-12 21:55:19

作为另一种解决方案,您可以创建一个多上下文场景,在该场景中,子托管对象上下文添加所需的所有数据,并在完成后保存发送新数据到主托管对象的子上下文,而不是回滚更改。这样,在完成整个过程之前,主托管对象上下文才会受到影响。

这是一篇很棒的文章,作为参考多上下文CoreData

基本上你需要做的是

代码语言:javascript
复制
// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

// create child MOC
_childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_childContext.parentContext = _mainContext;

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28486402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档