Objective-C Language
Multi-Threading
Ricerca…
Creare un thread semplice
Il modo più semplice per creare un thread è chiamare un selettore "in background". Ciò significa che viene creato un nuovo thread per eseguire il selettore. L'oggetto ricevente può essere qualsiasi oggetto, non solo self
, ma deve rispondere al selettore dato.
- (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.
}
}
Crea thread più complessi
L'utilizzo di una sottoclasse di NSThread
consente l'implementazione di thread più complessi (ad esempio, per consentire il passaggio di più argomenti o incapsulare tutti i metodi di supporto correlati in una classe). Inoltre, l'istanza NSThread
può essere salvata in una proprietà o variabile e può essere interrogata sul suo stato corrente (se è ancora in esecuzione).
La classe NSThread
supporta un metodo chiamato cancel
che può essere chiamato da qualsiasi thread, che quindi imposta la proprietà cancelled
su YES
in modo thread-safe. L'implementazione del thread può interrogare (e / o osservare) la proprietà cancelled
e uscire dal suo metodo main
. Questo può essere usato per chiudere con grazia un thread di lavoro.
// 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];
Memorizzazione locale del thread
Ogni thread ha accesso a un dizionario mutabile che è locale al thread corrente. Ciò consente di memorizzare le informazioni in un modo semplice senza la necessità di bloccare, poiché ogni thread ha il suo dizionario mutable dedicato:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
Il dizionario viene rilasciato automaticamente quando il thread termina.