两个NSFetchedResultsController,两个视图,一个实体类型

时间:2012-03-17 10:41:26

标签: objective-c ios core-data nsfetchedresultscontroller

我正在解决这个问题:

我对同一个实体有两个观点。第一个让用户CRUD实体(TouchModelVariable),第二个让用户将它分配给另一个实体(TouchModelConstraintTerm)。第二种观点仅供选择。但是当我通过第一个视图删除实体时,在第二个视图中滚动时,应用程序崩溃并出现“索引越界”错误。

详细说明:首先是第一个控制器,CRUD一个。

MSPUIManagedDocument *doc = self.document;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:MODEL_ENTITY_TOUCH_MODEL_VARIABLE inManagedObjectContext:doc.managedObjectContext];
fetchRequest.entity = entityDescription;
fetchRequest.fetchBatchSize = 20;

//[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"touchModel.active"] rightExpression:[NSExpression expressionForConstantValue:YES] modifier:NSDirectPredicateModifier type:nil options:nil];
// touchModel.active == 1
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"touchModel == %@", self.touchModel, nil];

NSSortDescriptor *sortDescriptior = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptior];
fetchRequest.sortDescriptors = sortDescriptors;

// nameSectionIndex
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:doc.managedObjectContext sectionNameKeyPath:@"name" cacheName:@"MSPVariablesManagementTableViewController"];
fetchedResultsController.delegate = self;

NSError *error = nil;
[NSFetchedResultsController deleteCacheWithName:@"MSPVariablesManagementTableViewController"];
if(![fetchedResultsController performFetch:&error]) {
    NSLog(@"Error while fetching <%@>, <%@>", error, [error userInfo]);
}

return fetchedResultsController;

TableView绑定到该控制器,正如“Pro CoreData for iOS”一书中所描述的那样。

第二个视图使用几乎相同的代码,但CacheKeys是不同的。如果我删除具有第一个视图的实体,然后在应用程序中导航到第二个视图(每次重新实例化),则应用程序在滚动时崩溃,因为它假定已删除的记录在那里。 在输入第二个视图之前,我还尝试保存ManagedObjectContext。

CRASH: *** -[_PFArray objectAtIndex:]: index (8) beyond bounds (8)
2012-03-17 11:36:48.953 MSPLPSolve[38685:fb03] Stack Trace: (
    0   CoreFoundation                      0x0192503e __exceptionPreprocess + 206
    1   libobjc.A.dylib                     0x01dc2cd6 objc_exception_throw + 44
    2   CoreFoundation                      0x018cda48 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x018cd9b9 +[NSException raise:format:] + 57
    4   CoreData                            0x003ffc23 -[_PFArray objectAtIndex:] + 131
    5   CoreData                            0x004ec260 -[NSFetchedResultsController objectAtIndexPath:] + 448
    6   MSPLPSolve                          0x0005d820 -[MSPUtilitiesVariablesSelectionTableViewController configureCell:cellForRowAtIndexPath:] + 128
    7   MSPLPSolve                          0x0003057b -[MSPFetchedResultsTableViewController tableView:cellForRowAtIndexPath:] + 283
    8   UIKit                               0x008efc54 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 494
    9   UIKit                               0x008f03ce -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 69
    10  UIKit                               0x008dbcbd -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1350
    11  UIKit                               0x008ea6f1 -[UITableView layoutSubviews] + 242
    12  UIKit                               0x00893d21 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 145
... a load of other stuff not in my code ...
当我通过第一个控制器删除实体并导航到第二个控制器之间完全保存文档(关闭,重新打开)时,

- 它不会崩溃。 NSFetchedResultsController是否在后台缓存了大量内容?是否有深入的指导如何缓存工作以及我如何使用它?

Puuuh,感谢您阅读这篇文章!无论你有什么想法,都可以!

标记

1 个答案:

答案 0 :(得分:0)

更改模型后,您是否在结果控制器上执行了performFetch?此外,我假设你的结果控制器委托方法正确实现。