2010-05-29 8 views
1

J'ai une application qui est chargée dans Google Spreadsheets via le client GData ObjC pour Mac/iPhone. Cela fonctionne bien tel quel. J'essaye d'obtenir la partie de téléchargement sur son propre fil et j'essaye d'appeler la méthode de téléchargement sur un nouveau fil.NSThread se terminant trop tôt

Rechercher:

-(void)establishNewThreadToUpload { 
    [NSThread detachNewThreadSelector:@selector(uploadToGoogle) toTarget:self withObject:nil]; 
} 

-(void)uploadToGoogle { 
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
    //works fine 
    [helper setNewServiceWithName:username password:password]; 
    //works fine 
    [helper fetchUserSpreadsheetFeed]; 
    //inside the helper class, fetchUserSpreadsheet feed calls ANOTHER method, which 
    //calls ANOTHER METHOD and so on, until the object is either uploaded or fails 
    //However, once the class gets to the end of fetchUserSpreadsheetFeed 
    //control is passed back to this method, and 
    [pool release]; 
    //is called. The thread terminates and nothing ever happens. 
} 

Si j'oublie d'utiliser un thread séparé, tout fonctionne comme il est censé. Je suis nouveau à la programmation de threads, donc s'il y a quelque chose qui me manque, s'il vous plaît indiquez moi!

Merci!

+1

Que signifie « Le fil se termine et rien ne se passe jamais » signifie? –

Répondre

0

J'ai eu ce problème et j'ai une solution, cependant, la solution me fait grincer des dents à mesure que ça fonctionne, mais quelque chose sent ça ... il semble que leur devrait être un meilleur moyen.

Je suppose que quelque part dans [helper fetchUserSpreadsheetFeed] vous utilisez une forme de NSURLConnection. Si vous utilisez une requête http asynchrone (où vous configurez le délégué pour les fonctions de rappel et autres), le thread peut se terminer avant que la connexion ait la possibilité d'invoquer ces fonctions de rappel et échouer silencieusement. Voici ma solution qui maintient le thread actif jusqu'à ce que les callbacks définissent une variable 'finished' sur YES. (Il me semble aussi avoir un code affichant des problèmes dans ces zones de texte si les anges qui courent autour des trucs de montage peut me aider ce serait génial!)

- (void)fetchFeed { 
//NSLog(@"making request"); 
[WLUtilities makeHttpRequest:self.feedUrlString withHttpHeaders:nil withDelegate:self]; 

//block this thread so it's still alive when the delegates get called 
while(!finished) { 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
} 

}

Le problème que j'ai avec cette solution est que la rotation alors que les boucles ne sont généralement pas une bonne pratique. Je ne suis pas sûr de la nature de l'entreprise runloop cependant, il peut être bien dormir et d'autres choses, mais je ne suis pas sûr. En tout cas, vous pouvez essayer et voir ce qui se passe!

REMARQUE: ma fonction "WLUtilities" est juste une enveloppe autour de la fonction NSURLConnection pour créer une requête HTTP asynchrone. Une autre solution que vous pouvez essayer consiste simplement à utiliser une requête de synchronisation, mais je n'aime pas beaucoup cette solution car l'appel asynchrone offre un contrôle plus fin sur la connexion.

+0

Tom, vous avez raison. Le client GData ObjC utilise des sélecteurs de rappel de manière asynchrone. La méthode fetchSpreadsheetFeed n'atteint jamais sa fonction de rappel. Je vais essayer votre solution. Merci pour l'information – Justin