Задача C Функционирование и прохождение объектов - PullRequest
0 голосов
/ 09 апреля 2010

Я прошу прощения, если об этом уже спрашивали, но не могу найти нужную мне информацию.

По сути, я хочу, чтобы UITableView заполнялся с использованием информации с сервера, аналогично примеру SeismicXML. У меня есть синтаксический анализатор как отдельный объект, правильно ли он выделить, инициализировать экземпляр этого синтаксического анализатора и затем сказать RootViewController, чтобы сделать его источником данных таблицы копию массива анализатора.

Я не могу включить код, потому что я еще ничего не написал, я просто пытаюсь получить дизайн прямо перед тем, как начать. Возможно что-то вроде:

xmlParser = [[XMLParser alloc] init];

[xmlParser getXMLData];

// Assuming xmlParser stores results in an array called returnedArray

self.tableDataSource = xmlParser.returnedArray

Это лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 09 апреля 2010

Нет, вы не хотите этого делать. Вы не хотите, чтобы ваш контроллер представления непосредственно обращался к массиву модели данных. Это будет работать в техническом смысле, но будет хрупким и, вероятно, потерпит неудачу по мере масштабирования проекта.

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

В такой ситуации я бы полностью обернул массив моей модели данных, сделав его свойством @protected или @private. Тогда я бы выделил методы для извлечения или вставки данных в реальный массив внутри самого класса модели данных. Ни один объект вне модели данных не должен иметь прямого доступа к массиву или знать его индексы.

Итак, в этом случае ваша модель данных будет иметь что-то вроде:

- (NSString *) textForLineAtIndexPath:(NSIndexPath *) anIndexPath{
    //... do bounds checking for the index
    NSString *returnString=[self.privateArray objectAtIndex:anIndexPath.row];
    if (returnString=='sometest'){
        return returnString;
    }
    return @""; //return an empty string so the reciever won't nil out and crash
}

, а также setTextForLineAtPath: метод для установки линии, если вам это нужно.

Общие учебные материалы не тратят достаточно (обычно вообще не уделяют) времени на обсуждение модели данных, но модель данных на самом деле является ядром программы. Именно здесь находится реальная логика приложения, и поэтому он должен быть одним из самых сложных и тщательно протестированных классов в вашем проекте.

Хорошая модель данных должна быть независимой от интерфейса, то есть она должна работать с интерфейсом на основе представления, веб-интерфейсом или даже с командной строкой. Ему не следует ни знать, ни заботиться о том, чтобы его данные отображались в виде таблицы или любого другого элемента или типа интерфейса.

Когда я начинаю новый проект, первое, что я делаю, это закомментирую '[window makeKeyAndVisible];' в приложении делегат. Затем я создаю свой класс модели данных и тестирую его old-school, загружая данные и регистрируя результаты. Только когда он работает именно так, как я хочу, я перехожу к пользовательскому интерфейсу.

Итак, задумайтесь над тем, что вы хотите, чтобы приложение делало на абстрактном уровне. Кодируйте эту логику в пользовательском классе. Изолировать данные от всех прямых манипуляций с любого другого объекта. Проверьте все входы в данные перед фиксацией.

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

0 голосов
/ 10 апреля 2010

Не может редактировать мой вопрос или публиковать ответы, могу только опубликовать мой ответ как ответ.

@ TechZen: Я тот, кто пытается проводить аналогии, помогает мне понять. То, что вы говорите, выглядит примерно так: Моя первоначальная идея была похожа на то, чтобы пойти в файловую комнату и выгрузить все оригиналы на моем столе, чтобы поработать над тем, где, как вы предлагаете, объект будет больше похож на организованного файлового клерка, который будет искать в данных я и только вернуть конкретную информацию, которая мне нужна, будучи единственной с прямым доступом к этим данным. Правильно ли я понял?

@ Тим: Что, если мне позже понадобится парсер, чтобы получить данные для чего-то, что не является таблицей? Вот почему я решил выбросить его в массив и позволить вызывающей стороне решить, что делать с данными. Вы бы предложили второй объект, который предоставил бы данные в новой требуемой форме? (Я что-то вроде правильного трека здесь или далеко?)

0 голосов
/ 09 апреля 2010

Не совсем. Вы хотите, чтобы источником данных был объект, который реализует протокол UITableViewDataSource ; в этой ситуации я бы создал объект, который реализует этот протокол и , анализирует XML, так что вы можете alloc - init, затем установите источник данных для этого объекта и обновите его. представление таблицы при необходимости. Исходя из вашего кода (и предполагая, что вы работаете в контроллере табличного представления):

XMLParserAndDataSource xpads = [[XMLParserAndDataSource alloc] init];
[xpads getXMLData];
self.tableView.dataSource = xpads;

Вероятно, было бы неплохо дать самому классу ссылку на объект NSXMLParser , так что вы можете использовать это для анализа XML, а затем предоставить вспомогательные методы (например, getXMLData), а также UITableViewDataSource методы для вашего собственного использования. (Если вы пойдете по этому пути, вы также должны заставить свой класс XMLParserAndDataSource реализовать более полезные методы делегата NSXMLParser и использовать их по мере необходимости для обновления вашего табличного представления.)

0 голосов
/ 09 апреля 2010

Я программист Mac, а не программист iPhone; но на маке, self.tableDataSource = xmlParser.returnedArray не правильно. Предполагается, что вы должны либо связать содержимое таблицы с контроллером массива (если у iPhone он есть?), Либо установить выход источника данных на свой RootViewController.

В вашем контроллере rootview вы бы реализовали методы:

– tableView:cellForRowAtIndexPath:
– tableView:numberOfRowsInSection:

Для – tableView:cellForRowAtIndexPath: вы бы вернули UITableViewCell с данными, полученными при разборе XML, в соответствии с индексным путем, например:

UITableCell *myCell = [UITableCell new]; 
myCell.textLabel.text = [parsedXMLArray objectAtIndex:[indexPath indexAtPosition:indexPath.length-1]];
return myCell;

( Люди не знают, что вы можете использовать метод + new class для всех подклассов NSObject, которые автоматически вызывают alloc / init. )

Для – tableView:numberOfRowsInSection просто вернуть счетчик массива данных:

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