Я сейчас бьюсь над этой проблемой:
У меня два взгляда на одну и ту же сущность. Первый позволяет пользователю CRUD Entity (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 для 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, спасибо, что прочитали это далеко! Независимо от того, есть ли у вас идея или нет!
Mark