Objective-C Language
Multi-Threading
Zoeken…
Een eenvoudige thread maken
De meest eenvoudige manier om een thread te maken is door een selector "op de achtergrond" aan te roepen. Dit betekent dat er een nieuwe thread wordt gemaakt om de selector uit te voeren. Het ontvangende object kan elk object zijn, niet alleen self
, maar het moet reageren op de gegeven selector.
- (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.
}
}
Creëer complexere threads
Door een subklasse van NSThread
kunnen complexere threads worden geïmplementeerd (bijvoorbeeld om meer argumenten door te geven of alle gerelateerde hulpmethoden in één klasse in te kapselen). Bovendien kan de NSThread
instantie worden opgeslagen in een eigenschap of variabele en kan worden gevraagd naar de huidige status (of deze nog actief is).
De klasse NSThread
ondersteunt een methode met de naam cancel
die kan worden aangeroepen vanuit elke thread, waarmee de cancelled
eigenschap vervolgens op een threadveilige manier wordt ingesteld op YES
. De thread implementatie kan opvragen (en / of observeren) de cancelled
eigenschap en verlaat de main
methode. Dit kan worden gebruikt om een werkdraad netjes af te sluiten.
// 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-lokale opslag
Elke thread heeft toegang tot een veranderlijk woordenboek dat lokaal is voor de huidige thread. Dit maakt het mogelijk om informatie op een eenvoudige manier in de cache op te slaan zonder de noodzaak om te vergrendelen, omdat elke thread zijn eigen specifieke veranderlijke woordenboek heeft:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
Het woordenboek wordt automatisch vrijgegeven wanneer de thread eindigt.