2016-03-01 43 views
0

在某些網站上,下面的方法無限期掛起,我想取消請求時,它需要太長時間,我認爲timeoutIntervalForRequesttimeoutIntervalForResource將控制這一點,但設置其中任何一個doesn似乎沒有任何效果。當請求過長時取消NSURLSession數據任務

這是一個例子網站,請求掛起無限期:http://www.samtoft.co.uk/showpic.php?id=542&order=&search=#header

// fetch data from URL with NSURLSession 
    class func getDataFromServerWithSuccess(myURL: String, noRedirect: Bool, callback: Result<String> -> Void) { 

     var loadDataTask: NSURLSessionDataTask? = nil 
     let sessionConfig: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 

     sessionConfig.timeoutIntervalForRequest = 10.0 
     sessionConfig.timeoutIntervalForResource = 10.0 

     var myDelegate: MySession? = nil 
     if noRedirect { 
      myDelegate = MySession() 
     } 

     let session = NSURLSession(configuration: sessionConfig, delegate: myDelegate, delegateQueue: nil) 
     loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 


       if let checkedData = data { 

       let success = Result.Success(NSString(data: checkedData, encoding: NSASCIIStringEncoding) as! String) 


       callback(success) 

       } else { 

        let redirectError = NetworkError.FailedUrl("\(myURL) + \(error)") 


        if let request = loadDataTask?.currentRequest { 

         guard let urlExtension = request.URL?.pathExtension else {return} 
         guard let domain = request.URL?.host else {return} 



         guard let finalURLAsString = request.URL?.description else {return} 
         let failure = Result.Failure("\(finalURLAsString) + \(redirectError)") 
          callback(failure) 

        } 

       } 
     } 
     loadDataTask!.resume() 


    } 

編輯:對於誰是有同樣的問題,我是人,問題是,我是佔成功案例和錯誤的情況下,而不是當請求返回響應,所以我加了如下:

if response == nil { 
       print("NO RESPONSE \(myURL)") 
       let noResponse = Result.NoResponse("NO RESPONSE") 
       callback(noResponse) 
      } 
+0

你在調用'dataTaskWithURL:completion:'。這是一種頭腦簡單的方式。如果使用'dataTaskWithURL'和一個委託,會發生什麼? – matt

回答

1

我已經提取代碼爲

func getDataFromServerWithSuccess(myURL: String) { 
    var loadDataTask: NSURLSessionDataTask? = nil 
    let sessionConfig: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 

    //sessionConfig.timeoutIntervalForRequest = 11.0 
    sessionConfig.timeoutIntervalForResource = 11.0 

    let session = NSURLSession(configuration: sessionConfig) 
    loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

     print("end") 
    } 

    loadDataTask!.resume() 
} 

它確實對超時有效。我想,可能有錯誤的代理人,無法正確地收到答覆。希望這可以幫助。

+0

謝謝你,這是非常有益的,我通過'MySession.getDataFromServerWithSuccess(urlAsString,noRedirect:false){result in'在'CollectionViewController'中調用它。還有什麼可能導致問題? – GarySabo

+0

您可以逐步調試您的項目。從最簡單的功能,如我提取的:),逐漸添加更多功能,然後找出哪個部分導致問題。 –

+0

謝謝,我一直這樣做,所以顯然在這些問題的網站上我的完成塊沒有解僱......但從你的角度來看,我的方法儘可能通過'timeOutIntervalForResource'控制超時是正確的? – GarySabo

相關問題