comment créer un synchrones NSURLConnection demande
Je suis désireux de créer un synchrones nsurlconnection demande. Oui je sais que je suis stupide et je sais que les limitations (gel de l'INTERFACE utilisateur), cependant la raison pour laquelle je souhaite la mise en place de ce grenat les données que je reçois de du serveur est reçu dans l'ordre qu'il est envoyé, qui Est l'un des avantages d'une connexion synchrone.. si j'ai lu correctement.
Je vais être à l'aide de Grand Central Dispatch pour atteindre certains multi threading pour exécuter la requête de synchronisation et ne pas avoir d'effet de l'INTERFACE utilisateur du thread principal... mais cela peut venir plus tard, pour l'instant, je voudrais maître de la connexion de synchronisation.
Le seul problème est que je ne suis pas exactement sûr de savoir comment configurer ma connexion synchrone..
Voici mon code.
- (void)loadComics{
[comics removeAllObjects]; //clears object of any old values
[[self tableView] reloadData];
NSURL *url = [NSURL URLWithString:@"http://www.comicbookresources.com/feed.php?feed=previews"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
//clear any existing connection
if (connectionInProgress) {
[connectionInProgress cancel];
[connectionInProgress release];
}
[xmlData release];
xmlData = [[NSMutableData alloc] init];
connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[xmlData appendData:data];
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
[parser setDelegate:self];
[parser parse];
[parser release];
[[self tableView] reloadData];
}
des exemples serait génial.
- Qu'entendez-vous par "grenat les données que je reçois de du serveur est reçu dans l'ordre il est envoyé"? Synchrone de réseautage—même dans un thread d'arrière-plan est presque toujours un indicateur d'une mauvaise conception.
- aussi loin que je me suis conscient asynchrone peut parfois recevoir des données dans un ordre incorrect. Le moteur de base de données, je vais avoir à communiquer avec m'oblige à faire ce syncronosly comme il est important de recevoir les données dans le bon ordre. Pourquoi pensez-vous que c'est un indicateur d'une mauvaise conception, je suis intéressé par votre point de vue comme je suis actuellement seul le fait que j'ai été instruit cependant si je peux mettre ensemble un cas à la base de données ingénieur quant à pourquoi il devrait donc sinon je serais intéressé à connaître votre opinion.
- Ce n'est pas exact — vous n'avez pas à vous soucier de la réception de
connection:didReceiveData:
rappels à l'ordre. Ce que vous avez écrit a l'air bien, vous pouvez simplement concaténer les blocs de données que vous les recevez, et faire quelque chose avec les données complètes dansconnectionDidFinishLoading:
. Ce ne serait qu'un problème si, pour une raison quelconque, vous étiez à l'exécution de plusieurs NSURLConnections dans le même temps, tous avec le même délégué. Mais en général, vous ne voulez pas le faire! - ok cool je obtenir ce que vous dites merci pour la clarification.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez une connexion synchrone, vous devez utiliser +sendSynchronousRequest:returningResponse:erreur il n'y a pas d'autre moyen pour ce faire.
Noter que c'est dépréciée en faveur de
NSURLSession
, mais il ne prend pas en charge la connexion synchrone directement.Synchrone réseau, même dans un thread d'arrière-plan, n'est-ce pas la voie à suivre. Vous ne pouvez pas correctement en charge l'annulation, et vous êtes le gaspillage des ressources, l'essaimage d'un thread d'arrière-plan qui va passer la plupart de son temps d'inactivité. Alors que c'est surtout une préoccupation académique, si vous êtes seulement à l'envoi d'une requête d'URL, il peut être une autre histoire si vous envoyez un grand nombre d'entre eux.
Vous n'avez pas à vous soucier de la réception de
connection:didReceiveData:
rappels à l'ordre. Ce que vous avez écrit a l'air bien, vous pouvez simplement concaténer les blocs de données que vous les recevez, et faire quelque chose avec les données complètes dansconnectionDidFinishLoading:
.Ce que vous avez à vous préoccuper est de la réception de plusieurs
connection:didReceiveResponse:
rappels dans le cas de redirections. Voir La documentation d'Apple. Dans ce cas, vous aurez simplement souhaitez réinitialiser les données que vous avez accumulé jusqu'à présent avec[xmlData setLength:0]
.Enfin, si vous pouvez exiger iOS5 ou 10.7 et n'ont pas besoin de la complexité d'un NSURLConnection délégué, puis le nouveau
+[sendAsynchronousRequest:queue:completionHandler:]
méthode est un gentil, non le mal alternative à+[sendSynchronousRequest:returningResponse:error]
.