2009-09-18 6 views
0

J'implémente le chargement de données dorsales avec un serveur en créant une NSOperation et en ouvrant NSURLConnections de manière synchrone.NSURLConnection Crashing

Ce code fonctionnait parfaitement dans le simulateur et l'appareil jusqu'à ce que j'ajoute une barre de progression avec des notifications remontant 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 EXC_BAD_ACCESS se bloque dans 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 fonctionne 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 établie (examiné les journaux de serveur, et la demande Traverse). Aucun objet NSDateComponent n'est alloué nulle part dans le code NSOperation avant le NSURLConnection.

J'ai essayé de trouver ce que je me suis soudainement mal passé avec NSURLConnection pour qu'il me déteste ainsi.

Toute aide est grandement appréciée!

Répondre

0

J'ai également posté cette question sur les forums des développeurs, et j'ai reçu la suggestion de supprimer la concurrence. J'ai enlevé la ligne fautive:

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

J'ai également arrêté le démarrage de remplacement, et seulement la commande principale.

NSURLConnection a arrêté de se bloquer.

1

Bien que je ne sache pas exactement quel est votre problème, je sais que j'avais l'habitude d'obtenir des erreurs aléatoires et des plantages lors de l'utilisation de NSURLConnection aussi. Puis j'ai trouvé ASIHTTPRequest et je n'ai jamais regardé en arrière. C'est une goutte de remplacement pour NSURLConnection et s'écoule de CFNetwork. Il est très stable (je l'utilise dans tous mes projets) et est livré avec un tas de goodies comme le support de barre de progression intégré et le téléchargement partiel-reprise. Il peut même écrire directement sur le disque pour économiser sur la RAM, importante dans l'iPhone.

+0

J'ai essayé d'utiliser ASIHTTPRequest, et il obtient des erreurs en essayant de décompresser mes données de réponse. Jamais arrivé avec NSURLConnection. – serpah

Questions connexes