2010-10-06 5 views
2

Est-ce que quelqu'un d'autre a ce problème avec ASIHTTPRequest? Il semble que lorsque j'effectue une requête asynchrone à partir d'un thread d'arrière-plan avec délégué mis à l'instance, je peux rencontrer des problèmes car le délégué peut être libéré avant que la requête (qui est placée dans NSOperationQueue) renvoie un rappel.ASIHTTPRequest Problème

Il semble que ASIHTTPRequest ne conserve pas son délégué - d'autre part, NSURLConnection d'Apple conserve le délégué ("NSURLConnection conserve son délégué lorsqu'il est initialisé.) Il libère le délégué lorsque la connexion se termine, échoue ou annulé."). Dois-je m'assurer d'effectuer des requêtes ASIHTTP synchrones dans les threads d'arrière-plan pour que cela fonctionne (au lieu de demandes asynchrones)? Ou peut-être que je devrais vider ASIHTTPRequest? Ou suis-je juste fou?

+0

Je ne suis pas sûr pourquoi cela a été marqué comme "wiki de la communauté"? – JosephH

Répondre

7

En supposant que vous utilisez une version très récente de ASIHTTPRequest, la bonne façon de travailler avec (et éviter les accidents) est que:

le délégué doit conserver la demande (et la demande ne devrait pas conserver le délégué)

le délégué doit faire ce qui suit lorsque le délégué est détruit (ou lorsque vous voulez annuler la demande):

[request setDelegate:nil];  
[request cancel]; 
[request release]; 

Vous ne devriez pas avoir de crash de cette façon. (J'ai réécrit le traitement des délégués dans ASIHTTPRequest il y a quelques mois pour éviter certains de ces problèmes, et j'ai vérifié avec les gens d'Apple que c'était une bonne façon de gérer les choses avant de le faire.Mes changements sont tous dans le référentiel officiel ASIHTTPRequest sur github, bien qu'il n'y ait pas eu de version officielle depuis - ces changements ne sont pas dans la version v1.7, donc avec v1.7 ou plus tôt vous pourriez toujours voir des plantages en suivant les conseils ci-dessus.)

+0

Merci, c'est ce que je cherchais –

+0

Donc, là est maintenant une méthode pour cela: –

+2

[request clearDelegatesAndCancel]; [demande de libération]; –

0

Je ne sais pas si ASIHTTPRequests ne conserve pas l'objet, mais avez-vous essayé de le conserver lors de l'exécution et de le relâcher à la fin?

Je n'avais encore un problème avec ce très bon emballage ^^

+0

Vous m'avez pensé dans un train de pensée différent - il se peut que la demande soit diffusée prématurément, et non le délégué - merci –

+0

Aucun problème ^^ Bonne chance – Vinzius