Question

J'implémente le chargement des données back-end sur un serveur en créant une opération NSO et en ouvrant NSURLConnections de manière synchrone.

Ce code fonctionnait parfaitement dans le simulateur et dans le périphérique jusqu'à ce que j'ajoute une barre de progression avec des notifications renvoyant au thread principal.

- (void)start {
     // stop execution if it's cancelled

     if([self isCancelled]) {
          [self willChangeValueForKey:@"isFinished"];
          finished = YES;
          [self didChangeValueForKey:@"isFinished"];
          return;
     } 

     // If the operation is not canceled, begin executing the task.
     [self willChangeValueForKey:@"isExecuting"];
     [NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];
     executing = YES;
     [self didChangeValueForKey:@"isExecuting"];
}

Maintenant, je reçois un blocage EXC_BAD_ACCESS lors de l'appel synchrone.

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/index.php", rootURL]];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];

NSError *error = nil;
NSURLResponse *response = nil;
receivedData = [[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error] mutableCopy];

Le stacktrace s'exécute comme suit:

#0  0x3430debc in objc_msgSend ()
#1  0x3136f996 in NSPopAutoreleasePool ()
#2  0x31374160 in -[NSAutoreleasePool release] ()
#3  0x331a0408 in _UIApplicationHandleEvent ()
#4  0x325339c4 in PurpleEventCallback ()
#5  0x3147a52a in CFRunLoopRunSpecific ()
#6  0x31479c1e in CFRunLoopRunInMode ()
#7  0x3314ec08 in -[UIApplication _run] ()
#8  0x3314d230 in UIApplicationMain ()
#9  0x00002ab0 in main (argc=1, argv=0x2ffff504)

Avec NSZombieEnabled, je reçois

*** -[NSDateComponents release]: message sent to deallocated instance 0x172fd0

Je sais que la connexion est en cours d'établissement (j'ai consulté les journaux du serveur et la requête est en cours de traitement). Aucun objet NSDateComponent n'est alloué dans le code NSOperation avant la connexion NSURLConnection.

J'ai essayé de comprendre ce que j'avais soudainement fait de travers avec NSURLConnection pour qu'il me déteste tellement.

Toute aide est grandement appréciée!

Était-ce utile?

La solution 2

J'ai également posté cette question sur les forums de développeurs et suggéré de supprimer la simultanéité. J'ai supprimé la ligne incriminée:

[NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];

J'ai également arrêté le démarrage prioritaire, et uniquement le remplacement de main.

NSURLConnection a cessé de planter.

Autres conseils

Bien que je ne sache pas exactement quel est votre problème, je sais que j’avais aussi des erreurs aléatoires et des plantages lors de l’utilisation de NSURLConnection. Ensuite, j'ai trouvé ASIHTTPRequest et je n'ai jamais regardé en arrière. C'est un remplacement instantané de NSURLConnection et fonctionne à partir de CFNetwork. Il est très stable (je l’utilise dans tous mes projets) et vient avec un tas d’excellentes fonctionnalités, comme une prise en charge intégrée de la barre de progression et une reprise partielle du téléchargement. Il peut même écrire directement sur le disque pour économiser de la RAM, ce qui est important pour l'iPhone.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top