2013-07-11 4 views
0

Je construis une application a 4 tab (Tabbar Controller), et chaque onglet que j'appelle une fonction (updateArray) après 2s. Je veux quand cliquez sur l'autre onglet, updateArray() fonction est kill. Mon problème est quand sur tab, updateArray() appel après 2s, quand je clique sur l'autre onglet, cette fonction est toujours appeler.Comment tuer NSThread en cliquant sur le nouvel onglet iOS?

C'est updateArray()

-(void)updateArray{ 

    while (loop) 
    { 
     [NSThread sleepForTimeInterval:2.0]; 
     [FileCompletedArray removeAllObjects]; 
     [temp removeAllObjects]; 
     [UserNameArray removeAllObjects]; 

     NSURL *url1 = [NSURL URLWithString:@"server"]; 

     AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: url1] ; 



     NSMutableURLRequest *afRequest = [httpClient requestWithMethod:@"POST" path:nil parameters:params1] ; 

     AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest]; 

     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSLog(@"Success"); 
      NSString * parsexmlinput = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
      NSLog(@"Response in Loop CompleteView: %@", parsexmlinput); //000400010001 
      // dispatch_async(dispatch_get_main_queue(), ^{ 
       [self parseXMLFile:parsexmlinput]; 

      NSLog(@"File Completed array: %@", FileCompletedArray); 
      NSLog(@"File Temp out array: %@", temp); 
      NSLog(@"File Completed count: %lu",(unsigned long)[ FileCompletedArray count]); 
      NSLog(@"File Temp out count: %lu", (unsigned long)[temp count]); 

      if([FileCompletedArray count] != [temp count]) 
      { 
       temp = [FileCompletedArray mutableCopy]; 
       NSLog(@"File Temp 1 array: %@", temp); 
       [_tableView reloadData]; 
       NSLog(@"File Temp 2 array: %@", temp); 

      } 
      [alert dismissWithClickedButtonIndex:0 animated:YES]; 



    //}); 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
               NSLog(@"error: %@", error); 

              } 
     ]; 
     [httpClient enqueueHTTPRequestOperation:operation]; 
    } 
} 

Et dans viewWillAppear()

-(void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    loop = YES; 
    temp = [FileCompletedArray mutableCopy]; 
    [self performSelectorInBackground:@selector(updateArray) withObject:nil ]; 

} 

Dans ma fonction, je l'ai utilisé [NSThread sleepForTimeInterval:2.0];, je ne sais pas comment tuer. Avez-vous des suggestions? Merci à l'avance

Répondre

2

Vous ne devriez pas vraiment utiliser sleepForTimeInterval, vous devez utiliser performSelector:withObject:afterDelay: (et cancelPerformSelectorsWithTarget:) ou dispatch_after. En l'état, vous pouvez ajouter un attribut BOOL qui est utilisé pour décider si le thread doit continuer après le sommeil ou s'il doit quitter (retourner).

+0

Oui, j'utilise la variable de boucle (type booléen), et le mettre au premier funtion updateArray. mais il fonctionne quand je clique sur l'autre onglet. – NGOT

+0

Donc après '[NSThread sleepForTimeInterval: 2.0];' vous devriez ajouter 'if (! Loop) return;' – Wain

+0

Pas besoin d'ajouter un bool; appelez 'cancel' sur l'instance' NSThread', puis quand le timer se déclenche (oui, utilisez un timer), testez '[[NSThread currentThread] isCancelled]' pour le voir si vous retournez YES. – bbum

0

Pour contrôler tous les threads que vous devez utiliser NSOperation En utilisant ceci, vous pouvez contrôler n'importe quel thread en cours d'exécution.

+0

Pouvez-vous exemple de code? Merci – NGOT

+0

http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues Jetez un oeil de NSOperations –

0

Créez un BOOL lorsque vous cliquez sur un autre onglet pour le définir sur FALSE. Utilisez ceci avec dispatch après.

@property (nonatomic, assign) BOOL doUpdate; 

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

if(doUpdate){ 
    //update work. 
} 
}); 

Vous devez prendre regarder à l'aide NSOperation et vous pourriez appeler [NSOperation cancelAllOperations] en cliquant sur un autre onglet.

Bonne chance,

Booranger

+0

merci mais cela ne fonctionne pas – NGOT

+0

Désolé, ne peut pas être utile, pourrait valoir déconner avec l'annulation de vos opérations réseau, [[[httpClient sharedClient] operationQueue] cancelAllOperations]; – BooRanger

Questions connexes