2017-04-24 45 views
0

我有一個非常奇怪的問題,在Android中,API調用需要300-500毫秒,而在iOS中需要1.5-2.5秒。我已經刪除了像我的服務器,設備特定的問題,互聯網連接等依賴項。我有一個非常簡單的示例代碼實例URL,對我來說,即使在模擬器上也需要2秒。網絡電話需要更多的時間在iOS上比在Android上

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    NSLog(@"start"); 

    // 1 
    NSURL *url = [NSURL URLWithString:@"https://httpbin.org/get"]; 
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 

    // 2 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setValue:@"" forHTTPHeaderField:@"Accept-Encoding"]; 
    request.HTTPMethod = @"GET"; 

    [[session dataTaskWithRequest:request 
       completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
        // Handle response here 
        NSLog(@"end - %ld", (long)[(NSHTTPURLResponse*)response statusCode]); 
       }] resume]; 
}); 

我也試過使用AFNetworking和ASSIHTTP庫,但沒有區別。我也檢查了標題,並且它們在Android和iOS中都是相同的。我在這裏做錯了什麼?

+0

嗨創建NSURLSession例如,我曾試圖用單一的API你的代碼,但它仍然需要1.62秒,經過服務器的響應時間僅顯示500毫秒。任何解決方案 –

回答

0

我覺得你的問題不是在網絡上,但在這條線: dispatch_async(dispatch_get_global_queue(0, 0), ^{

可以將其刪除,並再次檢查?

數據任務是異步的,因此您不需要將其包裝在另一個異步塊中。

你也不必爲每個請求

+0

改進響應時間的唯一方法是使用相同的NSURLSession對象。我可以重複使用同一個NSURLSession進行多個模擬電話嗎?我懷疑它不會被允許。 –

+0

是的,你可以。在向同一主機發出請求之前,重用會話是絕對沒問題的。換句話說,一個會話一個主持人。 – sage444

+0

似乎是這樣的問題,我不得不重新使用NSURLSession所有調用來解決它。謝謝。 –

0

當請求生成,發送,回調來分析時,你可以註銷時間戳(NSLog已經做過)。

0

服務器端代碼是否根據'用戶代理'進行任何處理? 如果您在iOS Safari和應用程序中打開網址,是否有時差?

您可以嘗試從postman(或另一個REST API測試工具,如firefox RESTClient)調用api,並覆蓋用戶代理以使用iOS值(http://www.enterpriseios.com/wiki/UserAgent)。如果時差仍然相同,則無法在移動代碼中執行此操作來解決此滯後問題。

P.S. : 1.重寫用戶代理在郵遞員需要一些調整:https://github.com/postmanlabs/postman-app-support/wiki/Postman-Proxy

相關問題