UITableView NSFetchedResultsController философия - PullRequest
1 голос
/ 11 января 2012

Я отображаю данные из CoreData в UITableView, используя NSFetchedResultsController в качестве контейнера для NSManagedObjects.Код для удаления строки работает хорошо, но моя реализация кажется мне менее элегантной.Есть ли лучший способ?

Приведенный ниже код иллюстрирует событие удаления:

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

{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        // Delete the row from the data source 
       [myContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

        if (![myContext save:&error]) { 
            // Error handling
        }  

        fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];        
    }   
}

Я установил fetchedResultsController на nil и выполнил еще одну выборку для обновления нового содержимого.

Что меня беспокоит, так это то, что я видел ссылки на различных форумах, намекающие на то, что изменение контекста должно автоматически вызывать изменения в fetchedResultsController и, возможно, этот второй выбор не нужен.На данный момент я не реализовал разделы.

Другая проблема заключается в том, что код просто делает строку исчезающей без какой-либо анимации.

Может быть, введена какая-нибудь приятная анимация?

1 Ответ

2 голосов
/ 12 января 2012

Изучите методы NSFetchedResultsControllerDelegate для управления изменениями в таблице и базе данных.Таким образом, всякий раз, когда вы делаете сохранение в NSManagedObjectContext NSFetchedResultsController, этот fetchedResultsController будет уведомлен управляемым контекстом ojbect.Затем fetchedResultsCotnroller будет вызывать его методы делегата.

Вы хотите реализовать controllerWillChangeContent: и controllerDidChangeContent: чтобы можно было заключить вызовы других методов делегата в вызовы методов beginUpdates и endUpdates для табличного представления.(См. Пример в справочнике.) Это удерживает табличное представление от синхронизации с fetchedResultsController.

Затем удалите эти строки:

 fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];     

Один разВы сделали это, вы можете ввести анимацию при вставке и удалении ячеек.

...