2015-01-07 3 views
6

Ich habe ein Problem, dass didReceiveData und didCompleteWithError nicht aufgerufen werden. Hier ist mein Code:NSURLSessionDataDelegate-Methode didReceiveData und andere werden nicht aufgerufen

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="+"[email protected]&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() 


} 

Diese sind Delegierte ich

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

} 

Hier habe ich mit Sollbruchstellen beobachtet

didReceiveResponse genannt wird, aber andere zwei sind nicht immer genannt .

Bitte helfen!

+0

Haben Sie die Lösung? Bin auch mit dem gleichen Szenario festgefahren – ChezhianNeo

+0

Sie können dafür den Abschluss-Handler verwenden. –

Antwort

12

die Methode Abschluss-Handler in Ihre Stellvertretung Implement

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

Completion Handler funktioniert gut, dass ich bereits weiß, aber ich wollte mit der Delegate-Methode gehen. –

+2

Um die anderen Delegate-Methoden funktionieren zu lassen, sollten Sie den Completion-Handler mit NSURLSessionResponseDisposition.Allow aufrufen – ChezhianNeo

+0

wird es definitiv versuchen :) –

3

I ChezhianNeo Kommentar über den Aufruf der didRecieveResponse Delegierten completionHandler mit NSURLSessionResponseAllow bestätigen werden, wie weiter unten

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

completionHandler(NSURLSessionResponseAllow); 
} 

Mit dieser Methode delegieren didRecieveData aktiviert gezeigt auch genannt werden.

Was auch funktioniert, zumindest ist es für mich getan hat, ist einfach nicht die didReceiveResponse Methode in Ihrer Stellvertretung zu implementieren, aber tun, um die didReceiveData Methode implementieren - „Überspringen“ die didReceiveResponse Methode ermöglicht didReceiveData Methode aufgerufen werden, was ‚doesn Es scheint sehr viel Sinn zu machen, aber es funktioniert.

Verwandte Themen