我已经坚持了几个小时的问题,并且已经在stackoverflow上阅读了所有相关信息(并应用了所有建议),我现在正式需要帮助.; O)
以下是上下文:
在我的iPhone项目中,我需要在后台导入数据并将其插入到托管对象上下文中.按照这里的建议,这是我正在做的事情:
有时(和随机),例外......
*** 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) 首先,抱歉这个问题太久了.
我知道这里讨论类似问题的问题很少,但这些问题都没有谈到NSFetchedResultsController与委托以及单独线程中的更新.并没有一个解决方案帮助了我.
这些是现有的问题:
现在关于我的问题:
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