2016-10-21 102 views
0

我正在嘗試將數據發佈到我的Web服務器時遇到一些有關URLSession的問題。然而,這是完美的。什麼似乎不起作用,是我設定的超時時間。這對於我的整個應用程序來說非常重要,因爲我不希望用戶永遠「加載」,沒有任何類型的錯誤信息。這裏是我的代碼:URLSession dataTask超時錯誤

var request = URLRequest(url: URL(string: "https://www.mywebsite.com/file.php")!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 20) 

let urlconfig = URLSessionConfiguration.default 
urlconfig.timeoutIntervalForRequest = 20 
urlconfig.timeoutIntervalForResource = 20 

request.httpMethod = "POST" 
let session = URLSession(configuration: urlconfig, delegate: self, delegateQueue: nil)//URLSession.shared 
let body = "receiver=\(receiverID)" 
request.httpBody = body.data(using: String.Encoding.utf8, allowLossyConversion: true) 
request.timeoutInterval = 20 

session.dataTask(with: request) {data, response, err in 
    if err == nil { 
     do { 
      let jsonResult:NSDictionary? = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary 
      let jsonComp = jsonResult?.value(forKey: "completion") as! String 
      if jsonComp == "done" { 
      } else { 
      } 
     }catch{} 
    } else { 
    } 
}.resume() 

我只是想超時設置爲20秒,然後返回一個錯誤(警報)。我怎樣才能做到這一點?我覺得我已經嘗試了一切可能,只需配置URLSessionConfiguration,然後設置.timeoutInterval即可。

幫助將不勝感激!

+0

已經很清楚這個問題是關於Swift的標籤。在標題中有什麼「Swift」的意思? –

+0

@LeoNatan因爲你認爲把'Swift'放在標題中是錯誤的,所以我不需要-1我的文章。但要回答你的問題,只是因爲我只想指出語言是Swift。我總是這樣做的東西。 – askaale

+1

我對此表示反對。我會降低這些問題,對不起 - 我不在乎我是否在風車上傾斜。 http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles –

回答

3

超時應該總是幾分鐘,而不是二十秒。在壞的蜂窩連接上進行DNS查詢可能需要二三十秒,而使用二十秒超時意味着在惡劣的網絡上,您的應用將完全無法使用。

你在UI中處理這種方式應該完全獨立於網絡代碼。開始請求並同時創建並啓動計時器。如果您的會話代理在計時器觸發時尚未收到...didReceiveResponse:...呼叫,請顯示「慢速網絡」UI,但讓網絡請求繼續,直至失敗。另外,如果你的請求是冪等的(也就是說,如果兩次發送請求是安全的),你可能會考慮讓第二個定時器的間隔很短(比如5秒),如果你沒有得到一個在該時間內致電didReceiveResponse:,並行開始第二個請求。如果第二個任務在您的二十二秒定時器觸發時沒有得到響應,請取消它。如果它首先得到響應,請取消原始請求。這可以幫助減少數據包丟失對用戶感知延遲的影響。

+0

好的,謝謝你整理出來。我知道了!但是,您是否告訴我,在x時間後,請求最終會失敗?因此,如果我在'if error == nil {} else else {print(「something here」)}'中創建一個警報,控制檯將打印'Something here'?另外,我可能會通過我的計時器在幾秒鐘後取消請求嗎? – askaale

+0

最終,它可能會失敗,在這種情況下,是的,你會被調用一個非零錯誤。我認爲默認是放棄90秒而不接收單個字節的數據,但我可能會記住錯誤的數字。默認情況下根本沒有最大總時間,因爲這會導致更長時間的下載失敗。 – dgatwood

+0

您最終可能會取消該請求,但您可能不應該這樣做。 Apple的一般建議是,如果用戶不再關心數據,則讓用戶取消請求。否則,假設用戶最終想要獲取數據,即使需要很長時間。 – dgatwood