2009-05-28 5 views

Antwort

20

würden Sie

tun Website
[self performSelectorInBackground:@selector(heavyStuff) withObject:nil]; 

Siehe NSObject reference auf Apple.

4

Sie NSOperationQueue und NSInvocationOperation verwenden:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                 selector:@selector(heavyStuff) object:nil]; 
[operationQueue addOperation:operation]; 

[self myBar]; 
15

für "Feuer und vergessen", versuchen [self performSelectorInBackground:@selector(heavyStuff) withObject:nil]. Wenn Sie mehr als eine Operation wie diese haben, sollten Sie sich die NSOperation und ihre Unterklasse NSInvocationOperation ansehen. NSOperationQueue verwalteten Thread-Pooling, die Anzahl der gleichzeitig Operationen und enthält Meldungen oder Sperrung Methoden ausführen, Ihnen zu sagen, wenn alle Operationen vollständig:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                 selector:@selector(heavyStuff) object:nil]; 

[operationQueue addOperation:operation]; 
[operation release]; 

[self myBar]; 

... 

[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished 

Auf einer niedrigeren Ebene, Sie -[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil] Gebrauch verwenden können.

+0

fehlt ein 'g' in performSelectorInBackround – Erich

+0

behoben. Danke @Erich. –

7

Sie haben hier viele gute Tipps, aber vergessen Sie nicht, etwas Zeit mit der Threading Programming Guide zu verbringen. Es bietet eine gute Anleitung nicht nur für die Technologien, sondern auch für ein gutes Design der gleichzeitigen Verarbeitung und dafür, wie die Ausführungsschleife sowohl mit Threads als auch mit Threads besser genutzt werden kann.

7

Wenn Sie Snow Leopard Targeting sind ausschließlich, können Sie Grand Central Dispatch verwenden:

[self myFoo]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self heavyStuff]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self myBar]; 
    }); 
}); 

Aber es wird nicht auf älteren Systemen (oder iPhone) laufen und ist wahrscheinlich übertrieben.

EDIT: es funktioniert auf dem iPhone seit iOS 4.x.

+0

NSOperation verwendet in Snow Leopard auch GCD, und es enthält eine NSBlockOperation-Unterklasse, so dass Sie Blöcke damit verwenden können. – Chuck

Verwandte Themen