Application crash when uninstalling from UITableView due to homing connection

I'm new to iPhone development (and the first question is posted here), and I'm kind of stuck in Core Data and Table Views.

In short, my application crashes when I delete a row from my UITableView because NSFetchedResultsChangeUpdate is called in a record that has already been deleted due to cascading deletion in a self-named table.

The following is a description of the data model:

There are two objects; Face and Compound .

The person contains the name (String), the connection (To Many Relationship to Connection → source, cascading delete rule) and associated with it (for many connections with the connection → connection, cascading removal rule)

A connection contains relations (String), source (relation to Person → connection, nullify delete rule) and connection (relation to Person → connectedby, nullify delete rule)

The idea is that there are two people connected by a relationship (e.g. Mother or Son)

In my TableViewController, I implement the following:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}

and

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    UITableView *tableView = self.tableView;
    Person *person = nil;
    switch(type) {
    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];         
        break;
    case NSFetchedResultsChangeDelete:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
    case NSFetchedResultsChangeUpdate:
        person = (Person *)[fetchedResultsController objectAtIndexPath:indexPath];
        [self configureCell:(PersonTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;          
    case NSFetchedResultsChangeMove:
        person = (Person *)[fetchedResultsController objectAtIndexPath:indexPath];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
    } 
}

and

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}

Here are examples of entries I created for testing:

Person *person1 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
[person1 setName:[NSString stringWithFormat: @"Tommy"]];

Person *person2 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
[person2 setName:[NSString stringWithFormat: @"Jane"]];

Connection *connection = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:managedObjectContext];
[connection setConnection:person2];
[connection setSource:person1];
[connection setRelationship:[NSString stringWithFormat:@"Mother"]];

Connection *connection2 = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:managedObjectContext];
[connection2 setConnection:person1];
[connection2 setSource:person2];
[connection2 setRelationship:[NSString stringWithFormat:@"Son"]];

When I delete an entry in indexPath [0,0], i.e. Jane in this example, since the view is sorted by name, I am generating the following error:

2010-10-19 16:09:01.461 HelpMe[6324:207] 
Serious application error.  
Exception was caught during Core Data change processing.  
This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.
*** -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0] with userInfo (null)
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] in image CoreData.

, NSFetchedResultsChangeDelete indexPath [0,0], NSFetchedResultsChangeUpdate [0,1], , [0,1], , [0,0] .

.

, -, , [self.tableView reloadData] DidChangeContent / didChangeOnject: , .

, .

+3
2

, -nil sectionNameKeyPath NSFetchedResultsController ( initWithFetchRequest).

, :

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"";
}

.

FYI, :

. NSFetchedResultsController -controllerDidChangeContent:. * - [NSMutableArray objectAtIndex:]: 0 userInfo (null)

+2

- (void)controller:(NSFetchedResultsController *)controller didChangeObject: fetchedResultsController. , , . NSFetchedResultsChangeUpdate. .

0

Source: https://habr.com/ru/post/1770427/


All Articles