Отправка информации обратно от делегата [iPhone]

Я использую NSXMLParser в своем файле RootViewController.m.

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:response_data];
[xmlParser setDelegate:self];
[xmlParser parse];
[xmlParser release];

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

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

Однако я хотел бы получить более одного XML-файла и делать разные вещи с его узлами; похоже, мне нужно использовать внешние файлы в качестве делегатов. Мой вопрос:

Если у меня есть следующие файлы реализации (и их файлы заголовков):

  • RootViewController.m
  • XMLDelegate1.m
  • XMLDelegate2.m

и установите ith делегата NSXMLParser как XMLDelegatei.m, как я могу заставить эти файлы возвращать NSDictionary, который затем можно добавить в NSDictionary, определенный в RootViewController.m?

Я предполагаю, что есть два возможных ответа:

  1. Используйте метод, о котором я не знаю; или
  2. Используйте лучший рабочий процесс

Подозреваю, что 2, но надеюсь, что 1.

Спасибо, Энди

ОБНОВЛЕНИЕ: Итак, я нашел способ достижения цели, хотя я не уверен, что это самый лучший способ. По сути, я заставляю своего делегата обновлять файл Plist и использую Центр уведомлений, чтобы узнать, когда это происходит.


person Andy    schedule 17.06.2010    source источник


Ответы (2)


Существует довольно хорошее обсуждение этой «проблемы» в Apple Руководство по XML-программированию, управляемому событиями В разделе "Использование нескольких делегатов" рассматривается используемая стратегия. Документ включает листинг кода для класса Element, в котором живут «умные» стороны алгоритма. В примере кода автор предполагает, что читатель знает, что пример предназначен для класса Element, у которого есть родительский элемент, имя, атрибут, дочерние элементы и свойства синтаксического анализатора. Класс Element реализует протокол NSXMLParserDelegate. Класс Element также будет иметь свойство NSMutableString *content, которое обновляется в методе - (void)appendString:(NSString *)aString метода, не включенном в образец.

person falconcreek    schedule 17.06.2010

Не ответ примера кода, а образец, если я понимаю ваш вопрос:

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

Это один из способов. программная установка делегатов (без использования IB) звучит как то, что вы хотите.

person James Robey    schedule 17.06.2010
comment
Проблема, с которой я столкнулся при создании какого-то класса XMLController.m, который обрабатывает весь синтаксический анализ XML, заключается в том, что метод didStartElement ничего не возвращает, особенно исходный вызов из моего RootViewController.m.. есть ли способ обойти это ? - person Andy; 17.06.2010