相关疑难解决方法(0)

"在枚举时收集变异"在executeFetchRequest上

我已经坚持了几个小时的问题,并且已经在stackoverflow上阅读了所有相关信息(并应用了所有建议),我现在正式需要帮助.; O)

以下是上下文:

在我的iPhone项目中,我需要在后台导入数据并将其插入到托管对象上下文中.按照这里的建议,这是我正在做的事情:

  • 保存主要的moc
  • 使用主moc使用的持久性存储协调器实例化后台moc
  • 将我的控制器注册为后台moc的NSManagedObjectContextDidSaveNotification通知的观察者
  • 在后台线程上调用import方法
  • 每次收到数据时,将其插入后台moc
  • 导入所有数据后,保存背景moc
  • 将更改合并到主线程上的主moc中
  • 取消注册我的控制器作为通知的观察者
  • 重置并释放后台moc

有时(和随机),例外......

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x5e0b930> was mutated while being enumerated...
Run Code Online (Sandbox Code Playgroud)

当我在后台moc上调用executeFetchRequest时,抛出...以检查导入的数据是否已存在于数据库中.我想知道什么是变异集,因为没有任何东西在import方法之外运行.

我已经包含了我的控制器和我的测试实体的整个代码(我的项目由这两个类和app委托组成,未经修改):

//
//  RootViewController.h
//  FK1
//
//  Created by Eric on 09/08/10.
//  Copyright (c) 2010 __MyCompanyName__. All rights reserved.
//


#import <CoreData/CoreData.h>

@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
    NSManagedObjectContext *managedObjectContext;
    NSManagedObjectContext *backgroundMOC;
}


@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSManagedObjectContext *backgroundMOC;

@end


// …
Run Code Online (Sandbox Code Playgroud)

cocoa multithreading core-data

121
推荐指数
1
解决办法
5万
查看次数

iPhone:NSFetchedResultsController,具有来自单独线程的委托和数据更新

首先,抱歉这个问题太久了.

我知道这里讨论类似问题的问题很少,但这些问题都没有谈到NSFetchedResultsController与委托以及单独线程中的更新.并没有一个解决方案帮助了我.
这些是现有的问题:

现在关于我的问题:

  • 我有一个单独的线程,用于从Web更新核心数据对象(使用套接字).
  • 很少有视图控制器显示来自同一核心数据对象的数据(每个选项卡包含一个显示其过滤数据的视图控制器).
  • 每个视图控制器都有自己的实例,NSFetchedResultsController并且委托设置为self.

有时我会was mutated while being enumerated在单独的线程中更新数据时收到异常,有时会崩溃应用程序.

我已经做了很多代码操作,试图修复它,似乎没有任何帮助.
我已经尝试不直接从表视图数据源方法使用托管对象.而不是我创建了一个包含字典列表的数组.我用didChangeObject上面的方法填写这些词典.这样我就不会在视图控制器中触摸托管对象了.

然后我明白问题出在NSFetchedResultsController中,可能一直在迭代数据.这是与单独线程中的数据更新冲突的对象.

问题是,一旦我有一个带委托的NSFetchedResultsController(意味着它"监视"数据并一直更新delagate),我如何更新单独线程中的核心数据对象.

NSFetchedResultsControllerDelegate实现:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    if ( self.tabBarController.selectedIndex == 0 ) {
        UITableView *tableView = self.tableView;
        @try {
            switch(type) 
            {
                case NSFetchedResultsChangeInsert:
                    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                    break;
                case NSFetchedResultsChangeDelete:
                    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                    break;
                case NSFetchedResultsChangeUpdate:
                    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; …
Run Code Online (Sandbox Code Playgroud)

iphone multithreading delegates core-data nsfetchedresultscontroller

5
推荐指数
1
解决办法
3836
查看次数