2017-04-26 2 views
0

J'essaie de mettre à jour une ancienne application pour passer de NSURLConnection à NSURLSession. Tout fonctionne très bien quand j'utilise des blocs pour NSURLSession:Les méthodes de délégué NSURLSession ne sont pas appelées

NSURLSessionDataTask *dataTask = [session 
              dataTaskWithRequest:request 
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {} 

Mais parfois, je dois analyser les données que l'application reçoit du serveur, donc j'ai besoin des méthodes didReceiveResponse et didReceiveData, semblables à ceux utilisés avec NSURLConnection. Je suis en train de le faire comme ceci:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration 
                 delegate:self 
               delegateQueue:nil]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"]]; 
[dataTask resume]; 

Mais mes délégués ne sont jamais appelés:

- (void)URLSession:(NSURLSession *)session 
NSURLSessionTaskDelegatedidReceiveResponse:(NSURLResponse *)response 
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
{ 
    NSLog(@"-----------------------> NSURLSessionTaskDelegatedidReceiveResponse"); 
    completionHandler(NSURLSessionResponseAllow); 
} 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
{ 
    NSLog(@"----------------> didReceiveData"); 
} 

Même chose quand je suis en train d'utiliser d'autres types de tâches (NSURLSessionDownloadTask par exemple) , leurs délégués ne sont jamais appelés. Je peux réellement voir dans le débogueur que les tâches passent à l'état en cours, mais je ne peux jamais recevoir d'appels aux délégués. Dans mon fichier d'en-tête, je ne vous conformez mon ViewController aux délégués:

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate> 

je l'ai fait un peu de recherche, mais même quand je suis en train quelques exemples de travail à partir du Web, ils cesseront de fonctionner dès que je tente de Collez-les dans mon projet. Par exemple this tutorial fonctionne parfaitement pour moi (je dois ajouter des permissions de sécurité de transport au fichier de plist, mais c'est à peu près tout). Mais lorsque j'essaie d'utiliser ce code dans mon projet, les délégués ne sont jamais appelés. Et quand je colle mon code à une autre application simple, ça marche très bien. Donc, quelque chose ne va probablement pas avec les paramètres de mon projet? Pourriez-vous s'il vous plaît me montrer ce qui peut causer quelque chose comme ça? Je suis complètement désorienté en ce moment.

+0

Avez-vous vu ceci: http://stackoverflow.com/questions/21200521/nsurlsession-delegate-methods-not-called ? – Koen

+0

Malheureusement, mon problème n'est pas lié à l'URL. J'ai essayé d'en utiliser quelques unes différentes, et au début j'utilisais l'URL qui était utilisée auparavant avec mon NSURLConnection via [session dataTaskWithRequest: request]; (c'était bien sûr avec https: //). – Evgeny

Répondre

3

Vous utilisez des blocs d'achèvement. Cela exclut les appels de délégués. https://developer.apple.com/reference/foundation/nsurlsessiondatadelegate?language=objc

bloc de gestionnaire d'achèvement sont principalement conçu comme une alternative à l'aide d'un délégué personnalisé. Si vous créez une tâche à l'aide d'une méthode que prend un bloc de gestionnaire d'achèvement, les méthodes de délégation pour la réponse et la remise de données ne sont pas appelées.

Et la méthode que vous souhaitez utiliser un nom différent pour

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

Oui, j'utilise des blocs, mais ils sont utilisés pour d'autres instances de NSURLSession dans l'application. J'ai mélangé un bloc et un délégué pour différentes instances de NSURLSession dans mon projet de test, ils ont travaillé sans aucun problème. Merci pour la correction de la syntaxe, j'ai probablement foiré quand je préparais le code pour le web. – Evgeny