NSURLConnection de délégation et de filetage - iPhone
J'ai une classe qui met à jour deux .des fichiers plist dans l'application répertoire documents via un NSURLConnection. La classe se comporte comme son propre délégué pour NSURLConnection. Il fonctionne correctement lorsque je demande un seul fichier, mais ne parvient pas quand j'essaie de mettre à jour deux fichiers. Faut-il regarder comme si je devais commencer un nouveau thread pour chaque getNewDatabase messages?
- (void)getAllNewDatabases {
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file1" waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file2" waitUntilDone:YES];
}
- (BOOL)getNewDatabase:(NSString *)dbName
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableString *apiString = [[NSMutableString alloc] initWithString:kAPIHost];
[apiString appendFormat:@"/%@.plist",dbName];
NSURLRequest *myRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:apiString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
[apiString release];
if( myConnection )
{
//omitted for clarity here
}
[pool release];
}
//NSURLConnection delegate methods here ...
OriginalL'auteur FluffulousChimp | 2009-08-01
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé quelque chose d'intéressant avec NSURLConnection et NSThread - le fil ne vivent que le temps nécessaire pour effectuer la méthode que vous appelez à partir d'elle.
Dans le cas ci-dessus, le thread va vivre aussi longtemps que
getNewDatabase:(NSString *)dbName
prend à accomplir, donc en tuant l'un de ses délégué méthodes avant d'avoir le temps de faire quoi que ce soit.J'ai trouvé cette site internet qui donne une meilleure explication et une solution pour le problème
J'ai modifié un peu afin que je puisse avoir un temps personnalisé si elle ne s'est pas terminée dans un délai donné (très pratique lorsque quelqu'un se promène entre les points d'accès)
OriginalL'auteur James Raybould
Tel qu'il est actuellement dans le code que vous avez fourni,
getNewDatabase:
est en cours d'exécution sur le thread principal de votre application. Le problème dans ce cas particulier, puis est autre chose que le cycle de vie d'un thread, comme Jacques l'a observé dans son cas.Si vous avez l'intention d'effectuer cette opération dans le fond, je vous recommande d'utiliser de
NSOperationQueue
etNSOperation
plutôt que de résoudre le problème avec le code actuel. Je pense que votre cas est un grand ajustement pourNSOperationQueue
, en particulier étant donné que vous avez plus d'un téléchargement de la tâche à effectuer.Dave Musée a une excellent article sur l'utilisation des API asynchrone, comme NSURLConnection, à l'intérieur d'un
NSOperation
. Sinon, tant que vous êtes en cours d'exécution dans un thread d'arrière-plan, vous pouvez également simplifier le processus et il suffit d'utiliser une API synchrones méthode à la place de votre NSOperation, commeinitWithContentsOfURL:
.Marcus Zarra a également écrit un tutoriel qui montre combien il est facile à intégrer et utiliser les NSOperationQueue pour de simples opérations d'arrière-plan.
OriginalL'auteur Sean Murphy