6
votes

NsurlConnection SendSynchronouseQuest - Contexte au premier plan

i m en utilisant sendsynchronousrequest pour obtenir les données du serveur. Je sais que synchrones attendra que les données reçues pour cette demande.

Mais le problème vient lorsque l'utilisateur par erreur entre une URL non existante et que tente d'obtenir une réponse. Dans ce cas, si l'utilisateur passe en arrière-plan et que le premier plan ne montre que l'écran noir. Il ne montre que la barre d'état. Aussi, il ne montre aucune application de base. Je dois appuyer sur le bouton de la maison pour sortir de ma demande.

sur Simulator, après 1+ minute, cela me montre le message qui "Demande de temps" (pas de crash).

sur le périphérique, dans un délai de 1 min. Application Obtenez des crashs.

Toute suggestion. De l'aide. C'est vraiment un problème sérieux dans mon application.

Merci.


1 commentaires

Obtenez-vous quelque chose dans la console avant de vous battre.


9 Réponses :


0
votes

Utilisez la classe ASIHTTTPEQUEST au lieu de NsurlConnection, ce n'est que Wrapper autour de NsurlConnection et a des rappels très simples, vous pouvez également régler le temps de remplir une demande. Veuillez passer à travers ce lien pour plus d'infos http://allseeing-i.com/adihttprectes/


2 commentaires

NsurlConnection fonctionne correctement pour moi, ce n'est que dans la case ci-dessus sa collision.


ASIHTTPEQUEST n'utilise pas du tout NSurLConnection. Aussi ASIHTTPEQUEST n'est plus en développement actif.



-1
votes

Je pense que l'application se bloque parce que vous n'obtenez aucune donnée lorsque vous n'obtenez aucune donnée lorsque l'utilisateur entrait mal URL et que vous utilisez ce "code renvoyé" nil nsdata faire des trucs.

Je pense que cela corrigera votre problème xxx


0 commentaires

0
votes

Je pense que vous devez d'abord tester les données de l'utilisateur s'il est correct ou non et que celui-ci est correct, envoie la demande autrement invite l'utilisateur qui "Veuillez saisir les données correctes" ...

ou

Lorsque votre analyse des données en réponse a échoué. Vous pouvez également faire une méthode de déléguée de protocole, c'est-à-dire finiwithwithError afin que vous proposiez votre dernière assurance-emploi.


0 commentaires

0
votes

Essayez celui-ci:

#import "ASIHTTPRequest.h"

//In a method
[self performSelectorInBackground:@selector(DownLoadImageInBackground:) withObject:imgUrlArr];  


-(void) DownLoadImageInBackground:(NSArray *)imgUrlArr1  
{
    NSURL * url = [Image URL];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];
}

-(void)requestFailed:(ASIHTTPRequest *)request

{

    NSLog(@"URL Fail : %@",request.url);

    NSError *error = [request error];

       // you can give here alert too..
}

-(void)requestFinished:(ASIHTTPRequest *)request

{

    NSData *responseData = [request responseData];
    UIImage *imgInBackground = [[UIImage alloc]
                         initWithData:responseData];
    [imageView setImage: imgInBackground];

}


0 commentaires

0
votes

Vous pouvez vérifier l'accessibilité de l'URL avant de commencer la demande. Apple a accessibilité méthodes pour le faire. Mais il est plus facile d'utiliser une enveloppe. Par exemple. ASIRACEABILITÉ .


0 commentaires

3
votes

Vous devez jeter un oeil à cet article: https: // développeur.apple.com/library/ios/#qa/qa1693/_index.html

iOS contient un chien de garde , si votre application est bloquée beaucoup de temps sur une opération sur le fil principal, celui-ci sera tué. (Pour plus de détails sur WatchDog: http://fr.wikipedia.org/wiki/watchdog_timer )

Donc, si vous voulez télécharger quelque chose, ne le téléchargez pas sur le fil principal.


2 commentaires

Je ne suis pas sûr, mais il ne mentionne pas le téléchargement. La connexion synchrone sur le thread principal peut avoir un sens pour un login peut-être


Je ne pense pas qu'il est logique d'utiliser une connexion synchrone sur le fil principal pour l'action de connexion. Il devrait être préférable de lancer l'asynchronisme, d'afficher un indicateur d'activité et de désactiver l'interaction utilisateur. Je vous suggère de créer une classe de connexion contenant une méthode avec un bloc de gestionnaire d'achèvement. (Si vous voulez un exemple, vous pouvez voir la classe Twrequest disponible dans iOS 5)



14
votes

Tout comme Julien dit, le chien de garde tue votre application. Pour répondre à quelques questions:

  • Pourquoi cela ne se produit-il que sur le simulateur? Parce que lorsque vous avez débogué, le chien de garde quitte votre application seule, cela peut prendre du temps.
  • Pourquoi cela ne se produit-il que lorsque l'utilisateur entre une mauvaise URL? En raison du délai d'attente du système, le système continuera à essayer 60 secondes s'il ne peut pas trouver de serveur.
  • Le problème est donc synchrone vs asynchrone? Non, le problème est le thread, vous pouvez faire la même opération dans un fil d'arrière-plan, ne le faites tout simplement pas sur le fil principal et que le chien de garde vous laissera seul.
  • Pourquoi l'écran est-il noir lorsque l'application se présente? N'oubliez pas que vous faites bloquer des trucs sur le fil principal, le fil qui dessine ...

    J'espère que tout était tout. Faites-moi savoir si j'ai raté quelque chose.


0 commentaires

9
votes

Pourquoi ne pas définir un délai d'attente pour votre connexion?

NSString *urlString = TEST_CONNECTION;
NSError *error = nil;
NSHTTPURLResponse *response = nil;
NSURLRequest *request = [NSURLRequest
                         requestWithURL:[NSURL URLWithString:urlString]
                         cachePolicy:NSURLRequestReloadIgnoringCacheData
                         timeoutInterval:5.0];


NSData *conn = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];


0 commentaires

2
votes

relate xxx


0 commentaires