Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从核心数据中的AppDelegate执行回滚功能时,需要访问ManagedObjectContext的同一实例_Ios_Objective C_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Ios 从核心数据中的AppDelegate执行回滚功能时,需要访问ManagedObjectContext的同一实例

Ios 从核心数据中的AppDelegate执行回滚功能时,需要访问ManagedObjectContext的同一实例,ios,objective-c,core-data,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobjectcontext,在我的iOS应用程序中,我使用核心数据来获取和删除一个非常大的数据集。此过程大约需要5-10秒。我想做的是执行回滚,以防用户在进程完成之前决定关闭设备。但是,问题在于使用相同的NSManagedObjectContext实例从适当的AppDelegate方法调用回滚函数。在我的应用程序中,我使用单例对象调用我的核心数据方法,如下所示: static MySingleton *sharedSingleton = nil; + (MySingleton *) sharedInstance {

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

static MySingleton *sharedSingleton = nil;


+ (MySingleton *) sharedInstance {

    if (sharedSingleton == nil) {
        sharedSingleton = [[super alloc] init];
    }
    return sharedSingleton;
}
- (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];
在我的应用程序中,我返回NSManagedObjectContext的一个实例,如下所示:

static MySingleton *sharedSingleton = nil;


+ (MySingleton *) sharedInstance {

    if (sharedSingleton == nil) {
        sharedSingleton = [[super alloc] init];
    }
    return sharedSingleton;
}
- (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];
然后我调用它,并将其分配给如下引用:

static MySingleton *sharedSingleton = nil;


+ (MySingleton *) sharedInstance {

    if (sharedSingleton == nil) {
        sharedSingleton = [[super alloc] init];
    }
    return sharedSingleton;
}
- (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,以便调用回滚函数?

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

这是一篇很好的参考文章

基本上你需要做的是

// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

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

希望能有帮助

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

这是一篇很好的参考文章

基本上你需要做的是

// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

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

希望能有帮助

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

这是一篇很好的参考文章

基本上你需要做的是

// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

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

希望能有帮助

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

这是一篇很好的参考文章

基本上你需要做的是

// create main MOC
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setPersistentStoreCoordinator:_persistentStoreCoordinator];

// create child MOC
_childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_childContext.parentContext = _mainContext;
希望能有帮助

首先,创建单例更好(更安全)的方法如下所示:,即:

接下来,因为您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强引用,确实如此

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

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

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

首先,创建单实例的更好(更安全)方法如下所示:,即:

接下来,因为您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强引用,确实如此

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

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

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

首先,创建单实例的更好(更安全)方法如下所示:,即:

接下来,因为您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强引用,确实如此

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

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

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

首先,创建单实例的更好(更安全)方法如下所示:,即:

接下来,因为您已经创建了一个必须挂起几秒钟的托管对象上下文,所以您必须在某个地方有一个对它的强引用,确实如此

如果您正在调试,并且有疑问