Выбор правильного шаблона проектирования для способа обработки запросов к серверу - PullRequest
2 голосов
/ 14 июня 2011

Я создаю приложение для iPhone, которое связывает много с моим веб-сервером.Связь осуществляется с использованием JSON.Теперь мне было интересно, как лучше всего справиться с этим.В настоящее время я начинаю третью попытку получить этот код как можно лучше, но я все еще не совсем уверен.

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

Моя вторая попытка состояла в том, чтобы сделать класс Singleton, где для каждого метода яуказано, какой делегат должен получать обратные вызовы.Это вызвало пару неприятных изменений кода (например, где-то хранится объект делегата, который может быть получен после выполнения запроса).При использовании Singleton методы сцепления были намного проще, но почему-то у меня возникает ощущение, что я полностью этим злоупотребляю.

В классе есть от 25 до 35 методов, которые могут иметь 2 результата: либо он работает, либо онне удалось (с определенным кодом ошибки и сообщением).Итак, мы говорим о 25 - 35 * 2 методах обратного вызова, которые нужно вызывать.

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

Ответы [ 2 ]

1 голос
/ 15 июня 2011

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

В основном, класс создается, и сразу вызывается autorelease.Он получает назначенного делегата и делает запрос.Весь этот процесс занимает 3 строки кода плюс одну строку кода для каждого параметра POST или параметра запроса GET.Аутентификация с помощью OAuth также занимает одну строку ([request setAuthenticator:[MyNameOAuthAuthenticator authenticatorWithCredentials:...]]).

В момент вызова -[req execute] он вызывает [self retain] для компенсации авто-выпуска.Когда сам запрос выполнен (или с ошибкой), делегат информируется с помощью объекта JSON, и вызывается [self release].Это решает все проблемы с памятью.

Мой код в настоящее время построен таким образом, что для его выполнения требуется минимум одна (!) Строка: [[[[MyRequest alloc] initWithHTTPMethod:httpMethodGET andURL:[NSURL URLWithString:...]] autorelease] execute]

Может быть, это поможет:)

0 голосов
/ 14 июня 2011

Я не знаю, помогает ли это, но я думаю, что недавно ответил на аналогичный вопрос. Посмотрите , как структурировать классы в приложении для iphone

...