2011-01-25 2 views
3

J'ai un problème dans mon viewController quand j'ai un ASIFormDataRequest en attente (démarré comme une tâche asynchrone) qui est toujours en cours d'exécution et l'utilisateur appuie sur le bouton de retour (afin de faire apparaître la vue).Iphone stop a ASIFormDataRequest

Est-il possible d'arrêter cette tâche asynchrone?

J'ai lu que c'est une méthode appelée "clearDelegatesAndCancel" mais je ne sais pas si c'est ce que je cherche.

Merci

+0

clearDelegatesAndCancel est celui que vous recherchez. – KishoreK

Répondre

6

chose est, d'appeler clearDelegatesAndCancel, vous devez avoir un gérer l'objet ASIFromDataRequest qui s'exécute de manière asynchrone. Cela signifie que vous devez le configurer comme une propriété, comme ...

@interface MyViewController : UIViewController <ASIHTTPRequestDelegate> 
{ 
    ASIFormDataRequest *theRequest 
    ... 
} 

@property (nonatomic, retain) ASIFormDataRequest *theRequest; 

Ensuite, dans votre .m, ne déclare pas de nouvel objet de demande, juste assigner votre formdatarequest à iVar de la classe:

@synthesize theRequest; 

-(void)viewDidLoad //or whatever 
{ 
    self.theRequest = [ASIFormDataRequest requestWithUrl:myUrl]; 
    // then configure and fire the request, being sure to set .delegate to self 
} 

-(void)viewWillDisappear:(BOOL)animated //or whatever 
{ 
    [self.theRequest clearDelegatesAndCancel]; 
} 

-(void)dealloc 
{ 
    [theRequest release]; //don't not do this. 
} 

Le point est, vous devez vous configurer de sorte que vous avez obtenu la demande pour parler à alors qu'il fonctionne de manière asynchrone. D'ailleurs, c'est vraiment une bonne pratique. Si votre viewcontroller s'en va (disons en se déconnectant de la pile UINavController) avant que votre requête ne retourne, il essaiera d'appeler la méthode delegate sur un objet désalloué, et boom.

3

De docs ASI (http://allseeing-i.com/ASIHTTPRequest/How-to-use)

 
    To cancel an asynchronous request (either a request that was started with 
    [request startAsynchronous] or a request running in a queue you created), 
    call [request cancel]. Note that you cannot cancel a synchronous request. 

    Note that when you cancel a request, the request will treat that as an error, 
    and will call your delegate and/or queue’s failure delegate method. If you do 
    not want this behaviour, set your delegate to nil before calling cancel, or 
    use the clearDelegatesAndCancel method instead.