NSURLConnection sendSynchronousRequest – arrière-plan au premier plan

J'utilise sendSynchronousRequest pour get datatables du server. Je sais que synchrone attendra jusqu'à ce que datatables reçues pour cette request.

Mais le problème survient lorsque l'user entre par erreur dans une URL inexistante et tente d'get une réponse. Dans ce cas, si l'user passe en arrière-plan et arrive au premier plan, il affiche uniquement un écran noir. Il montre seulement la barre d'état. Aussi, il ne montre aucune application de fond. Je dois appuyer sur le button Accueil pour sortir de mon application.

Sur le simulateur, après 1 minute et plus, il me montre le message "Demander un timeout d'attente" (Pas de panne).

Sur l'appareil, dans l'application 1 min get des accidents.

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

Merci.

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

  • pourquoi cela arrive-t-il seulement sur le simulateur? Parce que lorsque vous déboguez le chien de garde quitte votre application, cela peut prendre du time.
  • pourquoi cela se produit-il uniquement lorsque l'user entre une URL incorrecte? En raison du timeout d'attente du système, le système continuera à essayer pendant 60 secondes s'il ne trouve pas de server.
  • donc le problème est synchrone vs asynchronous? Non, le problème est le thread, vous pouvez faire la même opération dans un thread d'arrière-plan, ne le faites pas sur le thread principal et le chien de garde vous laissera seul.
  • Pourquoi l'écran est-il noir lorsque l'application apparaît? Rappelez-vous, vous faites des trucs de blocage sur le fil principal, le fil qui dessine …

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

Pourquoi ne pas définir un timeout d'attente pour votre connection?

NSSsortingng *urlSsortingng = TEST_CONNECTION; NSError *error = nil; NSHTTPURLResponse *response = nil; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:urlSsortingng] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0]; NSData *conn = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

Cela devrait libérer l'attente synchrone après un certain nombre de secondes, ce qui devrait résoudre votre problème sans passer par un appel asynchronous (ce qui n'est parfois pas la bonne solution)

Je sais que cela fonctionne correctement parce que c'est ainsi que je vérifie si je suis connecté à un certain VPN (où les drapeaux d'accessibilité échouent totalement).

vous devriez jeter un oeil à cet article: https://developer.apple.com/library/ios/#qa/qa1693/_index.html

iOs contient un chien de garde , si votre application est bloquée beaucoup de time sur une opération sur le thread principal, celui-ci sera tué. (pour plus de détails sur Watchdog: http://en.wikipedia.org/wiki/Watchdog_timer )

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

RAPPORTER

 UIImage *image = [self.imgCache objectForKey:urlSsortingng]; if(!image){ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:urlSsortingng] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURLResponse *response = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; NSLog(@"%@",response); UIImage *img = [UIImage imageWithData:data]; // if(img) { dispatch_sync(dispatch_get_main_queue(), ^{ [self.imgCache setObject:img forKey:urlSsortingng]; completionBlock(img); }); } }); } else{ completionBlock(image); } 

utilisez la class ASIHttpRequest à la place de NSURLConnection, il ne s'agit que d'encapsuler NSURLConnection et de callbacks très simples, vous pouvez également définir l'heure pour compléter une requête. S'il vous plaît passer par ce lien pour plus d'informations http://allseeing-i.com/ASIHTTPRequest/

Je pense que vous devez d'abord tester datatables de l'user si elle est correcte ou non et que si elle est correcte, envoie la request autrement user rapide qui "s'il vous plaît entrer datatables correctes" …

ou

lorsque votre parsing des données en réponse a échoué. Vous pouvez également faire en sorte que le protocole délègue la méthode, c'est-à-dire FinishWithError, pour que vous arriviez avec votre dernière interface user.

Essaye celui-là:

 #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]; } 

Cela pourrait vous aider: Je charge également un certain nombre d'images à la fois, donc les images qui n'ont pas de données correctes montrent un écran noir. Pour éviter cela, essayez de resize votre imageview.

Vous pouvez vérifier l'accessibilité de l'URL avant de lancer la requête. Apple a des methods d' Reachability pour le faire. Mais c'est plus facile d'utiliser un wrapper. Par exemple, ASIReachability .

Je pense que l'application se bloque parce que vous n'obtenez aucune donnée lorsque l'user saisit une URL incorrecte et que vous utilisez ce NSData «returnné» pour faire des choses.

Je pense que cela va résoudre votre problème

 NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if(data!=nil){ /// } else { NSLog(@"NO DATA"); }