Perte du MainThread

Bonjour,


 


Avant de commencer à  exposer ma problématique, je veux vous dire que c'est tellement bizarre et nouveau pour moi que même mon explication vous paraitra floue.


 


Quelque part dans mon code, j'essaye d'uploader une image sur mon serveur. Je fais ça correctement, et je reçois une réponse dans une méthode :



NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:file completionHandler:^(NSData *responseData, NSURLResponse *response, NSError *error) {
if (error){

else{

}
}];
[uploadTask resume];
 

Quelque soit la réponse du mon serveur, je vois sur l'output un truc louche et qui ,peut être, cause mon problème :


 



<Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces. 

Sachant que je crée une Variable d'environnement CA_DEBUG_TRANSACTIONS et que je la set à  1, j'ai ça en output:


 



<Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0 QuartzCore 0x2c86238d <redacted> + 256
1 QuartzCore 0x2c862249 <redacted> + 224
2 QuartzCore 0x2c863895 <redacted> + 24
3 ....
 

Quand la méthode upload Task aboutit, je fais un,




assert([NSThread isMainThread]);


Et pour le coup ça plante :/


J'espère que vous avez à  minima compris mon problème, sinon je suis là  pour toutes vos explications.


 


Merci d'avance. 


 


Réponses

  • AliGatorAliGator Membre, Modérateur
    Qu'est ce qui te fait croire que le block que tu passes en "completionHandler" s'exécute forcément sur le main thread ?

    La doc de la méthode en question dit explicitement : " The completion handler to call when the load request is complete. This handler is executed on the delegate queue. "
    Et quand tu regardes comment est défini ce delegate, dans la méthode d'init de ta session, c'est marqué : " If nil, the class uses a system-provided delegate ".

    Cela suggère donc que NSURLSession a son propre delegate et sa propre queue / son propre thread pour exécuter les requêtes, et donc que le completionHandler s'éxécute sur ce thread privé à  NSURLSession et non pas sur le main Thread. du coup c'est normal. Il faut que tu dispatch ton code sur le main thread pour qu'il s'exécute dessus et non pas sur la delegateQueue privée de NSURLSession.
Connectez-vous ou Inscrivez-vous pour répondre.