我遇到的问题是没有调用didReceiveData和didCompleteWithError。这是我的代码:
class LoginViewController: UIViewController, NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate {
.
.
.
}
@IBAction func loginAction(sender: AnyObject) {
var sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
var session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue:nil)
let postParams = "email="+"rabcd@gmail.com&password="+"abcd"
let url = NSURL(string:"http://myurl.com/api/v1/user/login")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let task = session.dataTaskWithRequest(request)
task.resume()
}
这些是我实施的代表
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
}
我在这里观看了断点
didReceiveResponse
被调用,但其他两个没有被调用。
请帮忙!
答案 0 :(得分:14)
在委托方法中实现完成处理程序
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
completionHandler(NSURLSessionResponseDisposition.Allow) //.Cancel,If you want to stop the download
}
答案 1 :(得分:4)
我确认ChezhianNeo关于使用NSURLSessionResponseAllow调用didRecieveResponse委托的completionHandler的评论,如下所示
height: 100vh;
这样也可以调用didRecieveData委托方法。
至少它对我来说也有用,就是不要在你的委托中实现didReceiveResponse方法,而是实现didReceiveData方法 - "跳过" didReceiveResponse方法允许调用didReceiveData方法,这似乎没有多大意义,但它确实有效。
答案 2 :(得分:1)
对于其他人:
就我而言,即使在我之后
都没有调用委托 didReceiveData :
1.在NSURLSession中设置委托。
2.使用NSURLSessionResponseAllow实现didReceiveResponse
原因:
将dataTaskWithRequest与完成处理程序结合使用可防止调用该委托。
您必须使用dataTaskWithRequest 无完成才能使用NSURLSession委托。