2010-12-03 3 views
0

J'essaie d'accélérer les performances de ma demande en effectuant des calculs dans les threads d'arrière-plan, mais j'ai des difficultés à le faire. A l'origine j'avais utiliséEffectuer la méthode avec la valeur de retour int dans le thread d'arrière-plan

[self performSelectorInBackground:@selector(calculateValue:) withObject:[words objectAtIndex:row]]; 

ce qui était bien quand mon sélecteur était une méthode vide. Cependant, j'essaie de faire quelque chose de similaire, mais évidemment le code ci-dessous n'est pas valide.

int value = [self performSelectorInBackground:@selector(calculateValue:) withObject:[words objectAtIndex:row]]; 

Toute aide est grandement appréciée.

Mise à jour

Voici la route que je vais actuellement. Je ne sais pas comment appeler au thread principal pour envoyer la valeur actualisée de computeWordValue à mon cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    int value = [self performSelectorInBackground:@selector(calculateWordValue:) withObject:[wordsSection objectAtIndex:row]]; 
    NSString *pointValue = [[NSString alloc] initWithFormat:@"Point:%d",value]; 
    cell.pointLabel.text = pointValue; 
} 

-(void)calculateWordValue:(NSString *)word { 

    [self performSelectorOnMainThread:@selector(computeWordValue:) withObject:word waitUntilDone:YES]; 
} 

-(int)computeWordValue:(NSString *)word { 

    return totalValue; //This will be a randomly generated number 
} 
+0

Comment la 'calculateWordValue' est rapide/lent et pourquoi essayez-vous de l'exécuter en arrière-plan à ce moment-là? –

+0

Il effectue beaucoup de calculs, je l'ai simplifié pour poster – aahrens

Répondre

1

Heres une manière que je l'utilise pour le faire:

-(void) calculateValue:(id) obj 
    { 
     // calculate value 
     [self performSelectorOnMainThread:@selector(didFinishCalculating:) withObject:[NSNumber numberWithInt:value]]; 
    } 

-(void) didFinishCalculating:(NSNumber *) val 
{ 
     // do what you need to do here 
} 

Ce vraiment doesn » Pour résoudre votre problème, je ne pense pas, mais il devrait au moins vous donner un point de départ.

MISE À JOUR:

Votre nouveau code me montre que vous avez vraiment pas besoin d'effectuer ce en arrière-plan, juste en cache la valeur à l'aide d'un NSDictionary ou quelque chose. Voici un exemple:

-(int) calculateValue:(id) obj 
{ 
     if ([valuesCache objectForKey:obj] == nil) 
     { 
      // calculate value 
      [valuesCache setObject:[NSNumber numberWithInt:result] forKey:obj]; 
      return result; 
     } 
     else 
     { 
      return [[valuesCache objectForKey:obj] intValue]; 
     } 
} 
+0

Je pense qu'il résout parfaitement le problème. Le problème est, bien sûr, que vous devez fournir le résultat sur le thread principal de manière asynchrone et la manière la plus simple de le faire est d'utiliser 'execSelectorOnMainThread:' – JeremyP

+0

J'ai suivi ces suggestions, mais je suis encore un peu confus sur la façon de passer la valeur int retour. J'ai ajouté plus de code ci-dessus pour plus de contexte. – aahrens

+0

Cela ne répond pas à la question de renvoyer la valeur au thread principal. @ Joe: Voir ogotts répondre. –

1

Il n'y a aucun moyen -performSelectorInBackground: ... pourrait retourner la valeur de la méthode que vous appelez parce qu'il retourne en fait avant que le sélecteur a même été exécuté. Ce sélecteur sera exécuté sur un thread d'arrière-plan dès que possible.

La solution gère le résultat de votre méthode de manière asynchrone, comme Richard a fait remarquer (la méthode dans sa réponse devrait être - (void)didFinishCalculating:(NSNumber*)val, car seuls les objets peuvent être passés dans -performSelector: ... appels):

  • Effectuez votre sélection sur un thread d'arrière-plan
  • Appelez votre méthode de gestionnaire de résultats sur le thread principal. Vous devriez le faire sur le thread principal dans presque tous les cas, car certaines choses dans Mac OS X et iOS sont conçues pour fonctionner sur le thread principal, comme les mises à jour de l'interface graphique.
Questions connexes