2009-03-16 6 views
3

J'ai créé une classe indpendante pour la connexion HTTP. Toute la connexion fonctionne bien. Le problème est que je trouve que la méthode 'didReceiveData' sera appelée APRÈS la méthode qui appelle la connexion. (Méthode « didReceiveData » sera appelée après IBAction « accepter »)Discussion sur la méthode 'didReceiveData' pour la connexion HTTP


- (IBAction)accept:(id)sender { 
    [self connect:url]; 
    //labelStr = ReturnStr; Cannot be written here. 
} 

-(void)connect:(NSString *)strURL 
{ 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
    if (theConnection) 
    { 
     // receivedData is declared as a method instance elsewhere 
     receivedData = [[NSMutableData data] retain]; 
    } 
    else 
    { 
     // inform the user that the download could not be made 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // append the new data to the receivedData 
    [receivedData appendData:data]; 
    ReturnStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 

Cela entraînera un problème que si je souhaite modifier le texte d'une étiquette à la chaîne reçue, le code ne peut pas être écrit dans IBAction ' accepter », mais doivent être écrits dans la méthode « didReceiveData » comme ceci:


    MainViewController *mainView = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; 
    AMEAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [delegate.navController pushViewController:mainView animated:YES]; 
    mainView.labelStr.text = ReturnStr; 

Un autre problème est que les données sur MainView seront écrasées si je MainView dans initialise « didReceiveData ». Est-il possible pour moi de changer le texte de labelStr sans initialiser MainView?

Répondre

1

Si vous souhaitez que votre application attende l'arrivée des données, utilisez la méthode sendSynchronousRequest:returningResponse:error: de NSURLConnection. Notez, cependant, que le reste de votre application sera gelé pendant l'exécution de cette méthode, et bien sûr, la méthode peut prendre un certain temps si l'utilisateur a une mauvaise connexion. Utilisation de NSMutableData au lieu de NSData.

+0

Y a-t-il quelque chose comme la méthode didFinishLoading? –

+0

Avec sendSynchronousRequest: returnResponse: error:, tout est géré par cette méthode. Au retour de la méthode, la connexion a été ouverte, la demande envoyée, la réponse reçue et la connexion refermée. Tout cela pourrait prendre quelques secondes, cependant. –

2

The problem is that I find method 'didReceiveData' will be called AFTER the method who call the connection. (method 'didReceiveData' will be called after IBAction 'accept')

Vous vous attendez à la connexion de vous envoyer connection:didReceiveData: avant de créer et de le connecter?

This will cause a problem that if I want to change the text of a label to the received string, the code cannot be written in IBAction 'accept' but have to be written in method 'didReceiveData' …

Sons à propos de droite. Vous ne pouvez pas travailler avec quelque chose que vous avez reçu jusqu'à ce que vous l'ayez reçu.

A further problem is that the data on MainView will be overwritten if I initialize MainView in 'didReceiveData'. Is it possible for me to change the text of labelStr without initialize MainView?

Création du contrôleur principal de vue et délégué de l'application dans votre méthode connection:didReceiveData: semble vraiment tard pour le faire. Faire ces choses plus tôt, alors connection:didReceiveData: faire rien, mais mettre labelStr.text.

BTW, la mise en œuvre de connection:didReceiveData: que vous montrez des fuites ReturnStr. N'oubliez pas de libérer ou de libérer automatiquement ce que vous avez alloué.

0

NSURLConnection et d'autres classes similaires sont conçus pour être utilisés de manière asynchrone. InitWithRequest: delegate: retourne immédiatement, et vous n'êtes pas fâché avec les choses de connexion jusqu'à ce qu'il envoie les méthodes déléguées à son délégué.

0

Comment arrêter la connexion lorsque le chargement est terminé?

+0

Salut new-soul, la donnée reçue est déjà déclarée comme NSMutableData. –