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

Ria*_*jee 7 swift ios8.1

我有一个问题,没有调用didReceiveData和didCompleteWithError.这是我的代码:

class LoginViewController: UIViewController, NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
@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()


}
Run Code Online (Sandbox Code Playgroud)

这些是我实施的代表

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?) {

}
Run Code Online (Sandbox Code Playgroud)

在这里,我看到了突破点

didReceiveResponse 被叫,但其他两个没有被调用.

请帮忙 !

Che*_*Neo 14

在委托方法中实现完成处理程序

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
completionHandler(NSURLSessionResponseDisposition.Allow) //.Cancel,If you want to stop the download
}
Run Code Online (Sandbox Code Playgroud)

  • 要使其他委托方法有效,您应该使用NSURLSessionResponseDisposition调用完成处理程序. (2认同)

小智 5

我将确认ChezhianNeo关于使用NSURLSessionResponseAllow调用didRecieveResponse委托的completionHandler的评论,如下所示

- (void) URLSession:(NSURLSession *)session dataTask:    (NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

completionHandler(NSURLSessionResponseAllow);
}
Run Code Online (Sandbox Code Playgroud)

这也使得 didRecieveData 委托方法能够被调用。

至少它对我来说也有效,就是简单地不在委托中实现 didReceiveResponse 方法,而是实现 didReceiveData 方法 - “跳过” didReceiveResponse 方法允许调用 didReceiveData 方法,这似乎并不使很有道理,但确实有效。