2009-12-11 5 views

Répondre

4

Jetez un oeil à NSObject référence classe - méthodes commençant par performSelector

0

Je me veux aussi une partie de code.

Cela est en train de faire, malheureusement, pas le comportement souhaité:

- (void) invokeLater_aux:(NSArray*)functionName_arg 
{ 
    NSLog(@"invokeLater_aux:"); 
    if(functionName_arg != nil && (functionName_arg.count > 0)){ 
     // split the params: 
     NSString* functionNameString = [functionName_arg objectAtIndex:0]; 
     NSLog(@"functionNameString: %@",functionNameString);  
     SEL functionName = NSSelectorFromString(functionNameString);   

     id arg = nil; 
     if(functionName_arg.count > 1){ 
      arg = [functionName_arg objectAtIndex:1]; 
     } 

     // call the function on main thread 
     [self performSelectorOnMainThread:functionName withObject:arg waitUntilDone:YES ];  
    } 
    [functionName_arg release]; 
} 

- (void) invokeLater: (SEL)functionName withObject:(id)arg 
{ 
    NSLog(@"invoke later: %@",NSStringFromSelector(functionName)); 
    [self performSelectorInBackground:@selector(invokeLater_aux:) 
          withObject:[[NSArray alloc] initWithObjects: 
             NSStringFromSelector(functionName),//the function name as String 
             arg,// the function arguments 
             nil] 
    ];  
} 

car il est de commencer un nouveau thread dans invokeLater et ne pas attendre pour terminer l'exécution du thread principal et il sera exécuté l'appel du invokeLater_aux en le fil principal (au changement de contexte?)

il est possible d'avoir n discussions avec ce code si vous appelez n fois le invokeLater.

  • comment attendre dans invokeLater_aux, jusqu'à ce que le thread principal est terminé?
Questions connexes