2012-06-20 2 views
2

У меня есть приложение iOS, использующее AFNetworking для сетевых вызовов. Все работает отлично, за исключением случаев, когда я пытаюсь захватить код состояния 401. Для возврата вызова с ответом требуется всего 60 секунд. Есть ли какие-либо настройки или что-то, что может вызвать это? Каждый успешный вызов возвращается мгновенно. Я также попытался запустить этот код через curl, и 401 возвращает мгновенно. Вот код, который я использую:AFNetworking занимает 60 секунд, чтобы вернуться с кодом статуса 401?

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

     __weak AFHTTPRequestOperation *_operation = operation; 

     [operation setCompletionBlock:^{ 
        //It takes 60 seconds to get to this line if a 401 is encountered 
      DDLogInfo(@"Response body: %@", [_operation responseString]); 

      if(_operation.response.statusCode == 401) { 
       DDLogInfo(@"Expired Auth Token"); 
      } 

      NSError *error = [_operation error];   
      NSData *responseData = [_operation responseData]; 

      if(responseData == nil && error == nil) 
       error = [NSError errorWithDomain:isDevMode ? DEV_SERVICE_BASE_URL : SERVICE_BASE_URL code:-1 userInfo:nil]; 

      callback(error, responseData); 
     }]; 

     [operation start]; 

ответ

2

Нужно инициализировать NSURLRequest значением таймаута, которое соответствует вашим потребностям.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:inURL 
                 cachePolicy:NSURLRequestReturnCacheDataElseLoad 
                timeoutInterval:10.0]; 

См. Документацию NSMutableURLRequest.

Затем инициализируйте AFHTTPRequestOperation AFNetworking с этим инициализированным запросом NSMutableURLRequest.

+0

Хорошо, я попробую. Но я все еще смущен, почему это будет тайм-аут? Он должен немедленно вернуться с 401, потому что сервер отвечает, но с кодом состояния ошибки. Как я могу получить его для немедленного возвращения, не испортив тайм-аут? – Bobbake4

0

Когда запрос не выполняется с кодом 401, вызывается блок отказа операции, который вы не установили. Используйте следующий метод AFHTTPRequestOperation для вашей операции, и блок отказов будет вызываться мгновенно.

- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
           failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

Извините, не заметил, что эта тема была 6 месяцев! Во всяком случае, для тех, кто все еще сталкивается с проблемой, ответ остается.

+0

не могли бы вы привести пример того, как это использовать? – trillions

+0

Прочтите это, это довольно понятно -> http://engineering.gowalla.com/AFNetworking/Classes/AFHTTPRequestOperation.html#//api/name/setCompletionBlockWithSuccess:failure: Быстрый поиск по github дал этот хороший пример -> https://github.com/poeks/TwitterTest/blob/0f46c3c882e036d19007723d6dca74f3d2561f67/TwitterTest/Networky.m Надеюсь, это поможет. –

Смежные вопросы