ASIHTTPRequest дизайн кода - PullRequest
       7

ASIHTTPRequest дизайн кода

3 голосов
/ 17 ноября 2009

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

Любой совет относительно хорошего подхода к дизайну был бы полезен. Спасибо.

Ответы [ 3 ]

7 голосов
/ 17 ноября 2009

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

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

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

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

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

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

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

0 голосов
/ 02 марта 2012

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

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

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

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];
}
...