2015-01-07 11 views
6

Sto avendo un problema che didReceiveData e didCompleteWithError non sono chiamati. Ecco il mio codice:metodo NSURLSessionDataDelegate didReceiveData e gli altri non sono chiamati

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() 


} 

Questi sono delegati ho implementato

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

} 

Qui ho guardato con punti di rottura

didReceiveResponse si chiama, ma altri due non sono sempre chiamati .

Please help!

+0

Hai la soluzione? Sono anche bloccato con lo stesso scenario – ChezhianNeo

+0

è possibile utilizzare il gestore di completamento per questo. –

risposta

12

implementare il gestore di completamento nel tuo metodo delegato

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

Il gestore di completamento funziona bene, ma lo so già, ma volevo utilizzare il metodo delegato. –

+2

Per rendere operativi gli altri metodi delegate, è necessario chiamare il gestore di completamento con NSURLSessionResponseDisposition.Allow – ChezhianNeo

+0

sicuramente lo proveremo :) –

3

io confermo il commento di ChezhianNeo di chiamare completionHandler del delegato didRecieveResponse con NSURLSessionResponseAllow, come illustrato di seguito

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

completionHandler(NSURLSessionResponseAllow); 
} 

Ciò ha consentito al metodo delegato didRecieveData essere chiamato pure.

Ciò che funziona, almeno ha fatto per me, è semplicemente non implementare il metodo didReceiveResponse nel delegato, ma implementare il metodo didReceiveData - "saltare" il metodo didReceiveResponse consente di chiamare il metodoReceiveData, che doesn ' Sembra che abbia molto senso, ma funziona.

Problemi correlati