Два NSFetchedResultsController, два представления, один тип объекта - PullRequest
0 голосов
/ 17 марта 2012

Я сейчас бьюсь над этой проблемой:

У меня два взгляда на одну и ту же сущность. Первый позволяет пользователю 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

1 Ответ

0 голосов
/ 17 марта 2012

Делали ли вы performFetch на контроллере результатов после изменения модели? Также я предполагаю, что ваши делегированные методы контроллеров результатов реализованы правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...