2017-02-20 47 views
0

當我關閉WiFi連接並在iPhone 6s 10.2模擬器上運行以下代碼時,回調永遠不會執行。我預計這個回調很快會出現「沒有互聯網連接」的錯誤。NSURLSessionTask永不回電無線關閉

NSLog(@"request-start"); 
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0]; 
task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    NSLog(@"request-end"); 
}]; 
[task resume]; 

我的問題

我獲取數據時,應用程序首次加載。如果wifi關閉,我需要顯示一個錯誤。如果我設置超時時間,它會被遵守 - 但它需要10秒以上,我寧願不讓他們等待。我也嘗試使用可達性檢測網絡狀態,但在首次加載應用程序時,網絡狀態通常爲unknown

+0

難道這是因爲你使用共享會話的? – matt

+0

「但它需要10秒以上,我寧願不讓他們等待」。我不明白,如果您的連接需要10秒才能收到回覆,爲什麼不設置超時?您需要設置一個超時來處理連接錯誤和超時。即使「wifi已開啓」也不意味着連接將100%工作。您不應該專注於「讓人們等待」,而是應該相應地處理錯誤和用戶界面,以便在連接花費比預期更多的時間時向用戶顯示進度信息。 – 2017-02-20 19:51:19

+0

@matt - 我不確定 - 我嘗試了'defaultSessionConfiguration'和'ephemeralSessionConfiguration'並得到了相同的結果 – bendytree

回答

1

timeoutIntervalForResource

這個屬性決定了在此基礎上配置會話中的所有任務 資源超時間隔。資源超時 區間控制在放棄之前等待整個資源 傳輸多長時間(以秒爲單位)。資源定時器在啓動 請求時啓動,並計數,直到請求完成或 達到此超時間隔,以先到者爲準。

默認值是7天。

timeoutIntervalForRequest

重要

任何上傳或下載由後臺會話 是如果原來的請求失敗自動重試創建由於 超時任務。要配置上傳或下載任務應允許重試或傳輸的時間長度,應使用 timeoutIntervalForResource屬性。

的默認值是60。

所以,沒有你們的超時設置,您的連接將7天運行。

通常,NSURLSession後臺會話不會使任務失敗,如果 線路上出現問題。相反,它會繼續尋找 的好時機來運行請求並在當時重試。這繼續 ,直到資源超時到期(即,用於創建會話的NSURLSessionConfiguration 對象中的 timeoutIntervalForResource屬性中的值)。該 值的當前默認值爲一週!

Source

+0

謝謝@Sneak。我沒有意識到它是故意設計成「等待重試請求的好時機」。有沒有等待重試的好時機提出請求的方法? – bendytree

+0

@bendytree您唯一的選擇是:http://stackoverflow.com/questions/7938650/ios-detect-3g-or-wifi/7938778#7938778,但是,Apple的最佳實踐和指南是檢查可達性* *之後**您遇到連接錯誤,顯示適當的消息,而不是每個請求。但是,我不知道你的用例是什麼,這就是你需要我的朋友。 GL,順便說一句,你應該設置超時時間,無論如何避免陷入奇怪的東西。 – 2017-02-20 20:35:04

+0

感謝您的幫助。基本上我不希望用戶等待完全超時(甚至只是10秒),當顯然沒有連接時。我想這在iOS上是不可能的。 – bendytree