我在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(),是否有任何代码看起来有问题导致它只挂在委托函数中?
修改:我会添加哪些代码来解决此问题。
答案 0 :(得分:2)
如果您未取消请求,则willPerformHTTPRedirection
应致电completionHandler
。正如文档所述,这个completionHandler
参数是:
您的处理程序应使用请求参数的值,修改后的URL请求对象或
NULL
来调用的块,以拒绝重定向并返回重定向响应的正文。