У меня есть представление с TableView и NSFetchedResultsController.Я использую ASINetworkQueue (подкласс NSOperationQueue) и подкласс ASIHTTPRequest (который, в свою очередь, является подклассом NSOperation), чтобы загрузить фид JSON, проанализировать его и вставить соответствующие объекты в Core Data.Поэтому в подклассе ASIHTTPRequest у меня есть второй NSManagedObjectContext, чтобы сохранить все потоки безопасными и красивыми.
Все хорошо, мой фоновый выбор / импорт срабатывает каждые 10 секунд или около того, новые сущности создаются и сохраняютсяв хранилище основных данных.NSNotification распространяется в ViewController и NSFetchedResultsController, и в TableView появляются новые строки.
Проблема возникает, когда JSON содержит сущность с новым значением ключа раздела (давайте назовем его «sectionID»)- например sectionID == 2 вместо sectionID == 1 (вы понимаете?).
На этом этапе NSFetchedResultsController должен заставить табличное представление создать новый раздел, но вместо этого я получаю исключение:
Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. *** -[NSArray initWithObjects:count:]: attempt to insert nil object at objects[0] with userInfo (null)
Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
Вот мой код для методов делегата NSFetchedResultControllers:
-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[[self eventTable] beginUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
NSIndexSet* set = [NSIndexSet indexSetWithIndex:sectionIndex];
switch (type) {
case NSFetchedResultsChangeInsert:
[[self eventTable] insertSections:set withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[[self eventTable] deleteSections:set withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView* tv = [self eventTable];
switch (type) {
case NSFetchedResultsChangeInsert:
[tv insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self tableView:tv configureCell:[tv cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
}
}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[[self eventTable] endUpdates];
}
Есть мысли о том, что вызывает исключение?Заранее спасибо!
ОБНОВЛЕНИЕ 2011-02-03 Не совсем уверен, возникает ли ошибка при создании нового раздела или удалении старого.Я почти думаю, что это происходит, когда все строки в разделе удаляются, но по какой-то причине контроллер: didChangeSection: atIndex: forChangeType не вызывается.Кто-нибудь с опытом чего-то подобного?
ОБНОВЛЕНИЕ 2011-02-08 Мне кажется, я решил это.Проблема заключалась в том, что при определении, следует ли удалять строку / раздел или нет, необходимо учитывать некоторые дополнительные условия.При использовании кода, предоставленного в документации Apple (вместе с некоторыми изменениями, чтобы он работал на мой взгляд), он работает нормально.