NSManagedObjectContext: автообновление или нет? - PullRequest
1 голос
/ 23 июля 2010

Мне нужно кое-что понять об обновлении NSManagedObjectContext.У меня есть UISplitView с UITableViewController на RootView и UIViewController на подробном представлении.Когда я нажимаю строку с данными, я загружаю некоторые данные в метки и в UITextView, где я могу обновить это поле:

- (void)textViewDidEndEditing:(UITextView *)textView {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
[[listOfAdventures objectAtIndex:indexPath.row] setAdventureDescription:textView.text];
}

ОК.Это работает правильно, описание обновляется.Кроме того, кто-то может захотеть удалить строку:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"playerPlaysAdventure.adventureName==%@",[[listOfAdventures objectAtIndex:indexPath.row] adventureName]];
    NSArray *results = [[AdventureFetcher sharedInstance] fetchManagedObjectsForEntity:@"Player" withPredicate:predicate withDescriptor:@"playerName"];

    [moc deleteObject:[listOfAdventures objectAtIndex:indexPath.row]];
    for ( Player *player in results ) {
        [moc deleteObject:player];
    }
    [listOfAdventures removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
    [self clearDetailViewContent];
    NSError *error = nil;
    if ( ![moc save:&error] ) {
        NSLog( @"Errore nella cancellazione del contesto!" );
        abort();
    }
}   
else if (editingStyle == UITableViewCellEditingStyleInsert) {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}   
}

Итак, вот моя проблема: если я прокомментирую строки о сохранении моего MOC, приключение удаляется только на мгновение.Если вы выйдете из приложения и снова откроете его, объект все еще там.Это не происходит с обновлением поля.Я хотел бы знать, почему и если я должен сохранить moc также в методе textViewDidFinishEditing.Заранее спасибо.

1 Ответ

1 голос
/ 23 июля 2010

Это разница между изменением атрибута объекта и добавлением или удалением всего объекта в графе объектов.

В первом блоке вы изменяете атрибут существующего объекта, который сохраняется автоматически, если вы не запускаете отмену. Это потому, что объект уже существует в графе объектов, и никакие другие объекты не должны быть изменены, чтобы внести изменения.

Во втором блоке вы удаляете весь объект и потенциально изменяете сам граф объекта, изменяя отношения между объектами. Это изменение не будет зафиксировано до неявного сохранения, потому что потенциально оно может вызвать каскад изменений для большого количества объектов.

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