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:
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"); }