不调用NSURLSessionDataDelegate方法didReceiveData和其他方法

时间:2015-01-07 21:02:50

标签: swift ios8.1

我遇到的问题是没有调用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被调用,但其他两个没有被调用。

请帮忙!

3 个答案:

答案 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委托。