Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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 如何创建/管理多个ManagedObjectContext?_Ios_Core Data - Fatal编程技术网

Ios 如何创建/管理多个ManagedObjectContext?

Ios 如何创建/管理多个ManagedObjectContext?,ios,core-data,Ios,Core Data,我有一个问题,我很有信心,我从广义上知道它是什么以及如何解决它,但我不确定,也没有找到实现解决方案的干净/最佳实践方法 我的问题是:我正在使用dispatch_async将文件中的一些数据加载到后台线程中的核心数据模型中,这可以正常工作,除非我在GUI中执行的操作也会影响模型,然后砰的一声,例如: 'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.' 。。。我认为这是由于两个

我有一个问题,我很有信心,我从广义上知道它是什么以及如何解决它,但我不确定,也没有找到实现解决方案的干净/最佳实践方法

我的问题是:我正在使用dispatch_async将文件中的一些数据加载到后台线程中的核心数据模型中,这可以正常工作,除非我在GUI中执行的操作也会影响模型,然后砰的一声,例如:

'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.'
。。。我认为这是由于两个线程在同一ManagedObjectContext中处理数据造成的,因为我目前只使用一个线程

我读过的所有文章和答案都告诉我应该为后台线程使用单独的ManagedObjectContext,但是如何/在何处设置它呢

我当前在我的应用程序委托中创建PersistentStoreCoordinator和(一个)ManagedObjectContext,并将ManagedObjectContext传递给我的(唯一的)视图协调器。它又将其传递给后台数据加载任务(这是我的一个模型类的类方法),从而导致问题

我应该吗

  • 将PersistentStoreCoordinator传递给视图控制器,以便它可以将其传递给后台任务,以便后台任务可以创建自己的本地ManagedObjectContext
  • 在应用程序委托中创建ManagedObjectContext池,并将它们全部传递给视图控制器,以便它可以自己使用其中一个并将其他对象分配给后台任务
  • 完全是别的吗

  • 我仍然无法始终如一地重现这个问题;它似乎高度依赖于时间。但以下是我为防止它所做的努力

    在视图控制器中:

    - (void) loadNewStuff: (NSString *)stuffID
    {
         dispatch_async(taskQueue, 
           ^(void){[MyModelClass loadNewStuff: stuffID withContext: myContext];}
         );
    }
    
    在模型类中:

    + (void) loadNewStuff: (NSString *)stuffID withContext: (NSManagedObjectContext *)passedContext
    {
      NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] init];
      [localContext setPersistentStoreCoordinator: passedContext.persistentStoreCoordinator];
    
      // load new stuff, save local context, finished
    
    }
    
    。。。这样可以吗,还是我忽略了一些会让我痛苦的东西


    (我使用的是ARC,所以我假设不显式释放本地创建的上下文就可以了?

    您能添加一些代码吗?尤其是生成异常的代码。你说得对,你应该小心地在线程之间管理你的NSManagedObjectContext对象,但不管怎样,看到你的代码真的很好。我还没有成功地重复创建完全相同的异常,我引用的就是一个例子。但每当我遇到问题时,总是在GUI中执行某些操作时,会更改ManagedObjectContext中的某些内容,而后台任务则在同一上下文中加载和保存数据。