Objective-C Language
Multi-threading
Sök…
Skapa en enkel tråd
Det enklaste sättet att skapa en tråd är genom att kalla en väljare "i bakgrunden". Detta innebär att en ny tråd skapas för att köra väljaren. Det mottagande objektet kan vara vilket som helst objekt, inte bara self
, utan det måste svara på den angivna väljaren.
- (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.
}
}
Skapa mer komplex tråd
Genom att använda en underklass av NSThread
tillåts implementering av mer komplexa trådar (till exempel för att tillåta överföra fler argument eller för att kapsla alla relaterade hjälparmetoder i en klass). Dessutom kan NSThread
instansen sparas i en egenskap eller variabel och kan frågas om dess nuvarande tillstånd (om den fortfarande körs).
NSThread
stöder en metod som kallas cancel
som kan anropas från valfri tråd, som sedan ställer in den cancelled
egenskapen till YES
på ett tråd-säkert sätt. Genomförande av tråden kan fråga (och / eller observera) den cancelled
egendom och lämna dess main
metoden. Detta kan användas för att graciöst stänga av en arbetartråd.
// 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];
Tråd-lokal lagring
Varje tråd har tillgång till en muterbar ordbok som är lokal för den aktuella tråden. Detta gör det möjligt att cache-information på ett enkelt sätt utan att behöva låsas, eftersom varje tråd har sin egen dedikerade, muterbara ordlista:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
Ordboken släpps automatiskt när tråden avslutas.