2011-09-05 2 views
0

J'ai un contrôleur de vue « MyViewController » qui fait des requêtes HTTP. J'ai défini les délégués de la demande à self (l'instance de myViewController). Tout fonctionne bien jusqu'à ce que j'écarte myViewController de la pile de navigation avant qu'une demande ne revienne. Dans ce cas, la requête tente d'envoyer un message à myViewController (qui provoque le blocage de mon application).demande HTTP commune motif délégué Objective-c (iOS)

Actuellement, je corrige/corrige ce problème en définissant le délégué de toutes les demandes à nil dans la méthode dealloc de myViewController. Quelle est la meilleure façon de faire cela?

Peut-être un singleton pourrait être responsable de traiter toutes les requêtes HTTP?

Répondre

2

Il y a quelque temps j'ai eu ce même problème pour les événements délégués UIWebView. La solution est de garder une trace de toutes les requêtes HTTP sortantes dans votre myViewController. Conservez donc une variable d'instance appelée mutableRequests sur laquelle vous ajoutez chaque requête que vous envoyez. Ce sera probablement aussi une bonne idée de supprimer les requêtes de ce tableau une fois qu'elles sont terminées. Dans la méthode -viewWillUnload, il suffit d'énumérer les numéros mutableRequests et d'annuler chaque demande. Cela vous permettra non seulement d'annuler toutes les demandes avant que votre vue ne soit désaffectée, mais cela vous aidera également à respecter le modèle de programmation release/retain en conservant tous les objets d'un tableau pendant qu'ils sont utilisés.

+0

Cette approche peut fonctionner. Bon à faire attention à ce qui se passe quand une demande est annulée. Par exemple, certaines requêtes peuvent envoyer au contrôleur de vue un message appelant requestCancelled (ou similaire). Pensez qu'il est possible que ce message soit envoyé après que le contrôleur de vue ait été libéré. – MrDatabase

+1

La seule façon de prendre en compte ce message après 'myViewController' est dealloc'd est que les requêtes HTTP rapportent à un autre délégué, tel qu'un objet global ou le délégué de l'application. –

1

dépend de ce que vous êtes contrôleur de vue est en train de faire. Si les demandes ne sont pertinentes que dans ce CV, faites ce qu'Alex suggère. Si votre application tourne autour des demandes (partie centrale de la fonctionnalité), vous aurez probablement besoin de ce singleton. Vous voudrez probablement également un délégué commun que tous vos contrôleurs de vue implémentent, de sorte que quel que soit le contrôleur de vue actuel, il peut gérer votre appel de délégué. De toute évidence, votre demande singleton manutention sera le délégué réel de vos demandes, et appelez vos méthodes de déléguer au besoin.