Основные данные и UITableView Практики / Вопросы - PullRequest
1 голос
/ 28 декабря 2011

Я новичок в программировании iPhone и в этом отношении CoreData. Мне было просто интересно узнать о некоторых общих приемах и способах ведения дел.

Я пытаюсь добавить / загрузить объекты из CoreData в UITableView. Таким образом, в AppDelegate я загружаю NSArray сущностей (NSManagedObjects) на didfinishlauninging switch и выбираю NSArray для моего контроллера табличного представления. В контроллере табличного представления он затем использует NSArray NSManagedObjects, чтобы указать представление ячейки в методе cellForRowAtIndexPath.

Это лучший способ сделать это? Должен ли я использовать массив NSManagedObjects, чтобы загрузить его и управлять этим массивом с помощью операций добавления / удаления, или следует извлекать циклы выборки и заполнять новый объект класса, который я создал отдельно, чтобы представлять каждый объект, который будет содержать каждая ячейка?

Я не хочу делать больше работы, чем нужно, но я тоже не хочу ничего делать плохо.

Пожалуйста, помогите, и большое спасибо!

1 Ответ

8 голосов
/ 28 декабря 2011

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

Шаблон проекта Базовых данных "Приложения Master-Detail" в Xcode 4.2 использует этот шаблон.Это хорошая ссылка и отправная точка.Вот как контроллер основного представления таблицы лениво загружает и настраивает свой контроллер результатов:

- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil) {
        return __fetchedResultsController;
    }

    // Set up the fetched results controller.
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return __fetchedResultsController;
}

Если у вас есть NSFetchedResultsController, достаточно просто подключить извлеченные объекты к методам источника данных табличного представления дляпример:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = <#Get the cell#>;
    NSManagedObject *managedObject = [<#Fetched results controller#> objectAtIndexPath:indexPath];
    // Configure the cell with data from the managed object.
    return cell;
}

Взгляните на шаблон проекта и прочитайте ссылки *1014* и NSFetchedResultsControllerDelegate протокола , чтобы узнать больше.Документация Apple включает полный пример исходного кода.

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