2009-11-17 1 views
3

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

Любые рекомендации по хорошему дизайну будут полезны. Благодарю.

ответ

7

Я использую подклассы Ben Copsey's ASIHTTPRequest очень сильно для клиента веб-сервиса, которого я надеюсь закончить в ближайшие пару недель. Это отличный проект, и его работа спасла мне много времени и сил.

У меня есть ASINetworkQueue, установленный в делете приложения. Очередь отправляется сообщение -go, чтобы оно было готово для получения запросов. Я добавляю свои подклассы в эту очередь. Каждый запрос обрабатывается и выдает свои уведомления, и мой контроллер представления обрабатывает данные ответа соответствующим образом.

То, что я сделал это подкласс ASIHTTPRequest и:

  1. Настройка -init метода (или -initWithParams: метода, в зависимости от запроса)
  2. Override -requestFailed: и -requestCompleted: для обработки сообщений об ошибках HTTP, возвращающиеся из веб-сервис
  3. Зарегистрированные пользователи, которые могут видеть сообщения NSNotification, могут исходить из обработки ошибок в методе -requestCompleted:

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

Прослушивание NSNotification позволяет мне выпускать диалоги UIAlertView, чтобы пользователь знал, что что-то пошло не так, или обрабатывать данные ответа на запрос (например, подавать результаты в хранилище основных данных), когда запрос дает успешную ошибку HTTP.

Является ли запрос успешным или неудачным, я помню -release запрос, когда я закончил с ним.

+0

Вам нужно иметь дело с токеном доступа на стороне сервера? В моем случае я должен отправить 3-4 запроса, и я не уверен, что они преуспеют или потерпят неудачу. Если они не сработают, мне придется попросить новый токен доступа, а затем повторить неудавшиеся запросы. Также я один провалился, нет причин запускать остальных, пока я не получу новый токен. И когда это доступно, просто запустите его в очереди ожидания. – Zsolt

0

Я написал одноэлементный класс, чтобы справиться с этим.

static TCHttpRequest *_sharedHttpRequest = nil; 
+ (id)sharedRequest 
{ 
    @synchronized(self){ 
     if (_sharedHttpRequest == nil) { 
      _sharedHttpRequest = [[self alloc] init]; 
     } 
    } 
    return _sharedHttpRequest; 
} 


- (NSDictionary *)loginWithUserName:(NSString *)user password:(NSString *)pwd 
{ 
    NSURL *url = [NSURL URLWithString:@"/login" relativeToURL:_url]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setCachePolicy:ASICacheForSessionDurationCacheStoragePolicy]; 
    [request setTimeOutSeconds:HTTP_REQ_TIMEOUT]; 
    [request addPostValue:user forKey:@"username"]; 
    [request addPostValue:pwd forKey:@"password"]; 
    request.delegate = self.delegate; 
    [_common_queue addOperation:request]; 
} 
0

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