2010-12-13 45 views
0

Je dois effectuer une minuterie en utilisant un NSThread car j'ai besoin de télécharger des données de texte à partir du web, et sans cela, en connexion 3G, il gèle l'interface utilisateur lors du téléchargement. J'ai donc utilisé un NSThread mais il gèle encore pendant un certain temps et je ne sais pas comment résoudre ce ....Même en utilisant l'interface nsthread gèle

Voici le code que je utilise pour effectuer la minuterie:

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

- (void)onTimerK2{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
timer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(onTimerKY2) userInfo:nil repeats:YES]; 
[pool release]; 
} 

- (void)onTimerKY2{ 
    NSLog(@"working"); 
} 

Répondre

1

Vous détachez un nouveau thread pour appeler onTimerK2, qui appelle immédiatement une méthode sur le thread principal, ce qui va bien sûr geler votre interface.

Modifier

Vous devriez faire un travail de longue haleine pas sur le thread principal (soit vous-même, ou en utilisant la nature asynchrone de NSURLConnection comme mentionné ailleurs), puis mettre à jour votre interface utilisateur en appelant sélecteurs sur le fil principal que cette activité progresse.

Cela dit, vous pouvez avoir plus de succès avec les modifications/réordonnancement de votre code suivant:

- (void)viewDidLoad { 
    timer = [NSTimer scheduledTimerWithTimeInterval:15 
              target:self 
              selector:@selector(onTimerK2) 
              userInfo:nil 
              repeats:YES]; 
} 

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

- (void)onTimerKY2{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSLog(@"working"); 
    [pool release]; 
} 
+0

ok, vous êtes, j'ai donc modifié le code, mais le minuteur ne fonctionne plus. voir le premier message s'il vous plaît et merci pour la réponse –

+1

Vous devez configurer la boucle d'exécution si vous souhaitez déclencher une minuterie à partir du thread secondaire. – taskinoor

+0

En fait, il n'appelle pas de méthode sur le thread principal. La minuterie sera programmée sur la boucle d'exécution du nouveau thread - qui n'est pas en cours de maintenance, de sorte que la minuterie ne se déclenchera pas. – JeremyP

0

Il est pas très clair comment vous essayez de résoudre le problème du gel de l'interface utilisateur en utilisant la minuterie. Mais si votre interface se bloque en raison du téléchargement, vous pouvez essayer asynchronous loading au lieu d'utiliser la minuterie ou de détacher un autre thread.

EDIT: Sauf si vous configurez une boucle d'exécution pour le thread secondaire, timer ne fonctionnera pas à partir de ce thread. Vérifiez le run loop management dans le guide de programmation de filetage. Cela peut être un travail beaucoup plus difficile que d'utiliser une connexion asynchrone.

+0

J'utilise une minuterie, car toutes les 15 secondes je dois télécharger des données à partir d'un txt en ligne où je prends du texte –

+0

Cela ne vous empêche pas de charger de manière asynchrone . – taskinoor