NSFetchedResultsController - получение исключения при создании нового раздела (UPDATE: может быть при удалении всех строк в разделе ...) - PullRequest
0 голосов
/ 31 января 2011

У меня есть представление с 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 (вместе с некоторыми изменениями, чтобы он работал на мой взгляд), он работает нормально.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Я думаю, что решил это.Проблема заключалась в том, что при определении, следует ли удалять строку / раздел или нет, необходимо учитывать некоторые дополнительные условия.При использовании кода, предоставленного в документации Apple (с некоторыми изменениями, чтобы он работал на мой взгляд), он работает нормально.

ОБНОВЛЕНИЕ 2011-03-22

В основном я использовал тот же подход, что и в SafeFetchedResultsController .

0 голосов
/ 31 января 2011

Я не знаю, является ли это причиной вашей ошибки, но вы упускаете случай NSFetchedResultsChangeMove в ваших методах делегата.

case NSFetchedResultsChangeMove:
    [changedTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [changedTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
    break;
...