无法从NSURLSession委托返回调用函数而不会终止任务

时间:2014-11-20 21:38:37

标签: ios swift delegates nsurlsession

我在Xcode 6.2(测试版)中使用Swift,但在6.1版本上遇到了同样的问题。我试图使用NSURLSession并相信我已正确设置它(请参阅下面的代码)。问题是我有一个委托设置来处理通过代码发生的重定向。我实际上需要在最终重定向之前捕获cookie,并且我通过代理执行此操作:

func URLSession(_:NSURLSession, task:NSURLSessionTask, willPerformHTTPRedirection:NSHTTPURLResponse, newRequest:NSURLRequest, completionHandler:(NSURLRequest!) -> Void )

这很有效,我能够成功执行代码并捕获我需要的cookie。问题是我需要在函数末尾添加task.cancel(),否则它似乎永远不会完成并返回到委托者(父?)函数。因此,我丢失了重定向URL的结果(尽管在我当前的项目中它是无关紧要的)。奇怪的是,这已经工作了一段时间,似乎停止了。我不相信我输入了任何改变它的代码,但必须发生一些事情。以下是相关代码。

NSURLSession功能:

func callURL (a: String, b: String) -> Void {
    // Define the URL
    var url = NSURL(string: "https://mycorrecturl.com");

    // Define the request object (via string)
    var request = NSMutableURLRequest(URL: url!)

    // Use default configuration
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()

    // Create the NSURLSession object with default configuration, and self as a delegate (so calls delegate method)
    let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

    // Change from default GET to POST (needed to call URL properly)
    request.HTTPMethod = "POST"

    // Construct my parameters to send in with the URL
    var params = ["a":a, "b":b] as Dictionary<String, String>

    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        // Do some other stuff after delegate has returned...
    })
    task.resume()
    return
}

委托代码:

func URLSession(_:NSURLSession, task:NSURLSessionTask, willPerformHTTPRedirection:NSHTTPURLResponse, newRequest:NSURLRequest, completionHandler:(NSURLRequest!) -> Void ) {
    // Check Cookies
    let url = NSURL(string: "https://mycorrecturl.com")
    var all = NSHTTPCookie.cookiesWithResponseHeaderFields(willPerformHTTPRedirection.allHeaderFields, forURL: url!)

    // Get the correct cookie
    for cookie:NSHTTPCookie in all as [NSHTTPCookie] {
        if cookie.name as String == "important_cookie" {
            NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(cookie)
        }
    }
    task.cancel()
}

它曾用于返回调用函数而不调用task.cancel()。如果没有调用task.cancel(),是否有任何代码看起来有问题导致它只挂在委托函数中?

修改:我会添加哪些代码来解决此问题。

1 个答案:

答案 0 :(得分:2)

如果您未取消请求,则willPerformHTTPRedirection应致电completionHandler。正如文档所述,这个completionHandler参数是:

  

您的处理程序应使用请求参数的值,修改后的URL请求对象或NULL来调用的块,以拒绝重定向并返回重定向响应的正文。