2014-06-24 35 views
5

用下面的代碼,如果沒有互聯網連接,故障塊會立即觸發 - 這很好。但是如果有連接但沒有互聯網呢?如何在AFNetworking的AFHTTPSessionManager中超時或檢測響應速度慢?

我讀過這個問題:How to set a timeout with AFNetworking它建議使用reachabilityManager和本答案中的示例顯示使用 - AFNetworking 2.0 queue request when device is offline with setReachabilityStatusChangeBlock does nothing。但是,如果我的模擬器或手機連接到我的wifi網絡,但沒有互聯網接入(DNS,DHCP或調制解調器問題),我的代碼目前仍然試圖長時間達到我的API。我沒有下載任何東西,我知道我的腳本,我的服務器應該在幾秒鐘內做出響應,所以我知道5秒鐘不活動之後,有些事情是錯誤的。

因此,我可以安全地做一個超時,或者我可以在我的當前腳本中使用reachabilityManager來檢測腳本(不是互聯網)是否無法訪問,如果是這樣,如何?

- (void)APICall:(NSMutableDictionary*)params { 

    NSURL *baseURL = [NSURL URLWithString:BaseURLString]; 
    NSDictionary *parametersGetAuthCode = @{@"req": @"getauth"}; 

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; 

    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [manager POST:APIscript parameters:parametersGetAuthCode success:^(NSURLSessionDataTask *task, id responseObject) { 
     if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) { 
      NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response; 
      if ([r statusCode] == 200) { 

      //do success stuff 

      } 
     } 
    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
     [alertView show]; 

     //do failure stuff 

    }]; 

} 
+1

「我知道我的劇本,我的服務器應該在幾秒鐘內作出迴應」>你也沒辦法讓移動網絡上這樣的假設...... 3G /邊緣可能很慢 –

+0

轉到橋下,進入老酒吧在大建設,你可能有一個非常緩慢的數據連接。所以你會阻止訪問你的用戶? – Larme

+0

我知道我在壞習慣的錯誤一面,但我寧願我的用戶得到一個超時,然後經歷與服務器通信的異常長時間的嘗試。 – Warren

回答

17

就想出一個合理的超時間隔是什麼,你的應用程序,並把它放在了AFHTTPSessionManager請求序列化。這樣,用戶就知道有事情發生

[manager.requestSerializer setTimeoutInterval:20.0]; 

添加東西到你的用戶界面,像UIActivityIndi​​catorView或「下載...」消息。

+0

完美。謝謝。 – Warren

+0

謝謝,夥計。這做了工作。 – Felipe

0

在Swift中,您可以使用下面的代碼來設置超時。

manager.requestSerializer.timeoutInterval = 25 
相關問題