Как я должен в идеале создать хорошо структурированный UITableViewDataSource?

У меня есть NSArray песен, извлеченных с сервера. Это мой источник необработанных данных. Массив содержит пользовательские объекты, которые имеют NSDictionary а также NSArray в качестве бэкэнда.

Мне интересно, если реализация отформатированного источника данных с использованием NSDictionary будет мудрым. Словарь будет иметь заголовки разделов в качестве ключей, а значение определенного ключа будет иметь NSArray содержащие строки для этого раздела.

Я буду перебирать свой источник необработанных данных и размещать его в алфавитном порядке в словаре.

У меня такое ощущение, что это не солидная реализация и очень дорогая. Есть ли другая, более надежная реализация, чем эта?

3 ответа

Решение

Для небольших столов, а не NSDictionaryЯ вообще пользуюсь NSArray, поскольку словари не сохраняют порядок (и вы, вероятно, не хотите постоянно пересортировать). Поэтому у меня обычно есть массив разделов, для которых у меня есть для каждой записи раздела, по крайней мере, заголовок раздела и массив строк. Мой массив строк содержит ту информацию, которая мне нужна для представления данной строки (например, текст строки и т. Д.).

Отдельные объекты строки и раздела, вы можете реализовать их как NSDictionary сами объекты (и иногда при анализе данных из JSON или XML, это проще всего), но я обычно определяю свой собственный Row а также Section объекты, например:

@interface Row : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;

@end

а также

@interface Section : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSMutableArray *rows;

@end

Тогда у моего контроллера табличного представления есть NSArray для разделов:

@property (nonatomic, strong) NSMutableArray *sections;

И я наполняю это так:

self.sections = [NSMutableArray array];

Section *sectionObject;

sectionObject = [[Section alloc] initWithTitle:@"Marx Brothers" rows:nil];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Chico"   subtitle:@"Leonard Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Harpo"   subtitle:@"Adolph Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Groucho" subtitle:@"Julius Henry Marx"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Zeppo"   subtitle:@"Herbert Manfred Marx"]];
[self.sections addObject:sectionObject];

sectionObject = [[Section alloc] initWithTitle:@"Three Stooges" rows:nil];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Moe"   subtitle:@"Moses Harry Horwitz"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Larry" subtitle:@"Louis Feinberg"]];
[sectionObject.rows addObject:[[Row alloc] initWithTitle:@"Curly" subtitle:@"Jerome Lester \"Jerry\" Horwitz"]];
[self.sections addObject:sectionObject];

И тогда у меня есть типичный UITableViewDataSource методы:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [self.sections count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    Section *sectionObject = self.sections[section];
    return [sectionObject.rows count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    Section *sectionObject = self.sections[section];
    return sectionObject.title;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    Section *sectionObject = self.sections[indexPath.section];
    Row *rowObject = sectionObject.rows[indexPath.row];

    cell.textLabel.text = rowObject.title;
    cell.detailTextLabel.text = rowObject.subtitle;

    return cell;
}

Для больших таблиц, управляемых данными базы данных, я мог бы не хранить данные в массивах, а использовать Core Data или SQLite, но идея та же. Убедитесь, что у меня есть Section а также Row классы, которые сохраняют мой код контроллера табличного представления самоочевидным и изолированным от деталей реализации данных.

Вы пробовали RestKit? Все, что вам нужно, это предоставить источник json-кодированных объектов и создать классы моделей

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

Другие вопросы по тегам