Использование разных делегатов для NSXmlParser - PullRequest
0 голосов
/ 02 февраля 2010

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

Например:

Я запрашиваю список людей из веб-службы. Результирующий список представляет собой элементы Xml Person, которые будут преобразованы в объект "Person" c объекта моей программой XmlDelegate.

Когда я вызываю функцию, чтобы получить человека, я передаю «PersonResultDelegate», который является протоколом с единственной функцией под названием «PersonReceived: (Person *) p». Итак, каждый раз, когда я получаю полный объект Person, я вызываю этот метод, и все хорошо. Итак, мой подробный вид (или вид результатов поиска) просто получает элементы, когда они доступны.

Проблема возникает, когда мне нужно получить более одного конкретного объекта. В моем конкретном случае мне нужно получить первое и последнее назначение для человека. Итак, мне нужно сделать два вызова API, чтобы получить эти два отдельных объекта Назначения. Каждый объект Appointment приведет к вызову зарегистрированного AppointmentResultDelegate, но как я узнаю, кто первый, а какой последний? Мне также нужно как-то разобраться со случаем, когда нет «первых» или «последних» назначений, и делегат никогда не будет вызван.

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

Решение

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

getNextAppointment withDelegate:self withContext:@"next"
getPrevAppointment withDelegate:self withContext:@"prev"

Таким образом, когда звонят делегату, я знаю, какое назначение доставляется.

1 Ответ

0 голосов
/ 02 февраля 2010

"Каждый объект Appointment приведет к вызову зарегистрированного AppointmentResultDelegate, но как я узнаю, какой из них первый, а какой последний?"

Рассматривая порядок, в котором вы получаете эти обратные вызовы. Или, глядя на какое-то значение в этих данных XML. Как последовательность или данные. Я, конечно, не знаю ваших данных.

...