Objective-C Language
Multi-Threading
Suche…
Einen einfachen Thread erstellen
Die einfachste Methode zum Erstellen eines Threads besteht darin, einen Selektor "im Hintergrund" aufzurufen. Dies bedeutet, dass ein neuer Thread erstellt wird, um den Selektor auszuführen. Das empfangende Objekt kann ein beliebiges Objekt sein, nicht nur ein self
, sondern muss auf den angegebenen Selektor antworten.
- (void)createThread {
[self performSelectorInBackground:@selector(threadMainWithOptionalArgument:)
withObject:someObject];
}
- (void)threadMainWithOptionalArgument:(id)argument {
// To avoid memory leaks, the first thing a thread method needs to do is
// create a new autorelease pool, either manually or via "@autoreleasepool".
@autoreleasepool {
// The thread code should be here.
}
}
Erstellen Sie einen komplexeren Thread
Die Verwendung einer Unterklasse von NSThread
ermöglicht die Implementierung komplexerer Threads (z. B. um das Übergeben weiterer Argumente zuzulassen oder alle zugehörigen Hilfsmethoden in einer Klasse zu kapseln). Darüber hinaus kann die NSThread
Instanz in einer Eigenschaft oder einer Variablen gespeichert und nach ihrem aktuellen Status (ob noch ausgeführt wird) abgefragt werden.
Die NSThread
Klasse unterstützt eine Methode namens cancel
, die von einem beliebigen Thread aus aufgerufen werden kann. Anschließend wird die cancelled
Eigenschaft auf Thread-sichere Weise auf YES
. Die Thread-Implementierung kann die cancelled
Eigenschaft abfragen (und / oder beobachten) und ihre main
beenden. Dies kann verwendet werden, um einen Arbeitsthread ordnungsgemäß herunterzufahren.
// Create a new NSThread subclass
@interface MyThread : NSThread
// Add properties for values that need to be passed from the caller to the new
// thread. Caller must not modify these once the thread is started to avoid
// threading issues (or the properties must be made thread-safe using locks).
@property NSInteger someProperty;
@end
@implementation MyThread
- (void)main
{
@autoreleasepool {
// The main thread method goes here
NSLog(@"New thread. Some property: %ld", (long)self.someProperty);
}
}
@end
MyThread *thread = [[MyThread alloc] init];
thread.someProperty = 42;
[thread start];
Thread-lokaler Speicher
Jeder Thread hat Zugriff auf ein veränderbares Wörterbuch, das lokal für den aktuellen Thread ist. Dadurch können Informationen auf einfache Weise zwischengespeichert werden, ohne dass ein Sperren erforderlich ist, da jeder Thread ein eigenes, wandelbares Wörterbuch hat:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
Das Wörterbuch wird automatisch freigegeben, wenn der Thread beendet wird.