2011-12-26 7 views
0

J'essaie d'exécuter une méthode en arrière-plan, mais elle bloque toujours le programme. Voici mon code:Multithreading dans Objective-C

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     self.MessagesList=[[MessagesArray alloc] init]; 

     [self performSelectorInBackground:@selector(backgroundMethod) withObject:nil]; 
    } 


    -(void)backgroundMethod 
    { 
     if ([MessagesList updateFromServer]){ 
      [self.Table reloadData]; 
      CFRunLoopRun(); 
    } 
} 

Alors que updateFromServer envoie une requête HTTP au serveur et en attente d'une réponse, le serveur retarde la réponse de 10 secondes, et le résultat est que l'ensemble du programme est retardé de 10 secondes aussi. Pouvez-vous me corriger?

Mise à jour: J'ai ajouté une ligne d'exécution, mais le problème reste le même. La requête HTTP est asynchrone, mais tout de même - le programme entier attend jusqu'à ce que le serveur réponde. Ceci est ma méthode updateFromServer:

responseData = [NSMutableData data]; 
[self setBaseURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLRequest *request = 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
return TRUE; 

Comment puis-je faire asynchrone pour de vrai?

+0

Pourquoi ne pas utiliser NSThread? –

+0

Je l'ai essayé aussi. rien ne change. merci –

Répondre

1

Toujours mettre à jour l'interface utilisateur sur le thread principal, [self.Table reloadData] ne met pas à jour sur le thread d'arrière-plan. Comment envoyez-vous une requête HTTP? NSURLConnection asynchrone ou synchrone?

S'il s'agit d'une connexion synchrone, il bloque le thread sur lequel il s'exécute jusqu'à la réception de la réponse.

+0

lorsque je lance une requête synchrone, il le bloque. asynchrone ne fonctionne pas (il s'exécute si je l'appelle depuis le thread principal, mais l'instruction if est bloquée car elle attend une réponse). de toute façon - comment puis-je mettre à jour l'interface utilisateur à partir du thread principal si j'ai besoin de vérifier toutes les mises à jour à partir du serveur? –

+0

A partir d'un thread d'arrière-plan, vous pouvez appeler - [NSObject performSelectorOnMainThread: withObject: waitUntilDone:] sur n'importe quel NSObject. Je l'ai fait dans de nombreux endroits pour un excellent effet. –

+0

@AmitHagin, Ajoutez une boucle d'exécution pour votre thread d'arrière-plan NSURLConnection asynchrone. – 0x8badf00d