2010-09-29 6 views
6

Come posso chiamare un metodo statico in modo asincrono?Come posso chiamare un metodo statico Objective-c in modo asincrono?

+ (void) readDataFromServerAndStoreToDatabase 
{ 
    //do stuff here 
    //might take up to 10 seconds 
} 
+0

Non esiste un metodo statico. Questo è un esempio di un metodo di classe che viene inviato alla classe, non un'istanza. Nota come è ancora inviato a qualcosa. Questo dovrebbe darti un'idea di come fare ciò che vuoi (o leggere la risposta di mipadi). – JeremyP

risposta

16

Utilizzare un NSThread:

[NSThread detachNewThreadSelector:@selector(readDataFromServerAndStoreToDatabase) 
         toTarget:[MyClass class] 
         withObject:nil]; 
+0

Non so perché questo è stato votato. In modo succinto e abbastanza diretto ha risposto alla domanda. – bbum

+0

Sono d'accordo così + 1. – JeremyP

3

È possibile utilizzare this method contro l'oggetto della classe. Supponiamo di avere

@interface MyClass:NSObject{ 
.... 
} 
+ (void) readAndStoreDataToDatabase; 
@end 

e poi fare

NSThread*thread=[NSThread detachNewThreadSelector:@selector(readAndStoreDataToDatabase) 
              target:[MyClass class] 
             withObject:nil ]; 

Si noti che l'oggetto di classe di una classe che eredita da NSObject è un NSObject, in modo da poter passare a questi metodi. Vedere da solo eseguendo questo programma:

#import <Foundation/Foundation.h> 

int main(){ 
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
    NSString* [email protected]"foo"; 
    if([foo isKindOfClass:[NSObject class]]){ 
     NSLog(@"%@",@"YES"); 
    }else{ 
     NSLog(@"%@",@"NO");  
    } 
    if([[NSString class] isKindOfClass:[NSObject class]]){ 
     NSLog(@"%@",@"YES"); 
    }else{ 
     NSLog(@"%@",@"NO");  
    } 
    [pool drain]; 
} 

Il punto è che, in Objective-C, metodi di classe (che sono chiamati metodi statici in C++) sono solo metodi standard inviati all'oggetto classe. Per ulteriori informazioni sugli oggetti di classe, guarda questi fantastici post del blog da Hamster e da Cocoa with Love.

+0

Esatto, ma scommetterei che l'interrogante non ha idea di quanta corda abbiano appena ricevuto. ;) – bbum

+0

Sì, ho fatto un sacco di threading prima, non sapevo che fosse possibile chiamare un metodo statico attraverso un thread, quindi la parola chiave qui era [classe MyClass] – aryaxt

+0

Non esiste una cosa come una ' metodo static' in Objective-C :) Sono 'metodi di classe', e vengono inviati' dinamicamente' all'oggetto classe. Una volta capito, è perfettamente naturale che tu possa farlo. – Yuji

6

Esistono diversi modi per realizzare la concorrenza nell'obiettivo-C, a seconda dell'ambiente in cui si sta eseguendo. Pthreads, NSThreads, NSOperations, GCD & tutti hanno il loro posto. Dovresti leggere la "Guida alla programmazione della concorrenza" di Apple per qualsiasi piattaforma tu abbia scelto come target.

+0

+1 per menzionare l'ampia scelta di opzioni e la guida pertinente –