2016-11-17 235 views
5

這是蘋果的文件說,關於NSURLSessionTaskNSURLSessionTask。暫停不起作用

任務的suspend方法,而暫停,不產生任何網絡流量和不受超時。

好的。所以我運行下面簡單的代碼:

 let url = NSURL(string: "http://httpbin.org/delay/10")! 
     let urlRequest = NSURLRequest(URL: url) 

     self.task = NSURLSession.sharedSession().dataTaskWithURL(urlRequest.URL!, completionHandler: { 

      data, response, error in print("completion ERROR \(error)") 
     }) 

     self.task.resume() 

     print("Start") 
     delay(5, closure: { 

      self.task.suspend() 

      print("Suspend") 
     }) 

功能delay它僅僅是dispatch_after的包裝和http://httpbin.org/delay/10請求給予10秒後響應。在等待迴應的過程中,我暫停了任務。然而,這不起作用。在60秒內,完成程序段被調用併發生超時錯誤。任何人都可以解釋什麼是錯的?

+0

能帶你逛逛'dispatch_after'包裝? –

回答

5

這似乎是正常的行爲,但是蘋果的更多權威性文檔將有助於澄清我們所看到的內容。

Apple的文檔沒有提供關於暫停如何工作或應何時使用的詳細說明。但是,我的觀點(基於測試和研究)是suspend()應該只用於下載 任務。數據任務只能在適當時使用resume()(啓動任務)和cancel()

我的測試,使用Xcode和Charles Proxy,顯示暫停的數據任務對網絡流量沒有影響,如Apple的文檔中所示。換句話說,網絡流量產生了。

我觀察到的暫停使用和數據的任務,兩件事情:

1)如果這就是所謂的簡歷之後,它對數據的任務沒有影響。它不會暫停網絡流量,也不會限制網絡或服務器端的問題,在回調中收到成功的響應。

2)如果這就是所謂的dispatch.asyncAfter回調,但仍然沒有暫停的網絡流量,但是回調得到一個「請求超時」的錯誤,而不是成功的響應。根據查爾斯代理,請求是成功的,但。正是由於這個結果,我認爲suspend()不應該與數據任務一起使用。我認爲這種回調的結果基本上是無用的。

取消數據任務:

cancel()按預期工作。客戶端(您)在從服務器獲得完整響應之前關閉連接。這可以在調用resume()之後或稍後(在請求完成之前)完成。

+0

「請求超時。」?那是什麼?傳入完成塊的錯誤?所以它適用於你,就像我一樣,因此對於暫停的任務來說這是正常的行爲,對吧?如果是,那爲什麼我們需要暫停?還是我誤解了一些東西? –

+0

@AndreyChernukha對不起,我似乎誤解了你的問題。我以爲你沒有看到控制檯中的「暫停」消息。 –

+0

@AndreyChernukha你是對的,我已經更新了我的答案以提供更多細節。數據任務似乎是正常行爲。下載任務可能不會傳遞到完成塊,直到任務恢復並完成。 –

0

我同意暫停()對URLSessionDataTask

    let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is received all the time") 
        } 
       } 
       dataTask.resume() 
       dataTask.suspend() 

沒有效果然而,當我試着取消它

let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is cancelled") 
        } 
       } 
       dataTask.resume() 
       dataTask.cancel()