Objective-C Language
Wielowątkowość
Szukaj…
Tworzenie prostego wątku
Najprostszym sposobem utworzenia wątku jest wywołanie selektora „w tle”. Oznacza to, że tworzony jest nowy wątek w celu wykonania selektora. Obiektem odbiorczym może być dowolny obiekt, nie tylko self
, ale musi on reagować na dany selektor.
- (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.
}
}
Utwórz bardziej złożony wątek
Użycie podklasy NSThread
pozwala na implementację bardziej złożonych wątków (na przykład, aby umożliwić przekazywanie większej liczby argumentów lub enkapsulować wszystkie powiązane metody pomocnicze w jednej klasie). Ponadto instancję NSThread
można zapisać we właściwości lub zmiennej i można zapytać o jej bieżący stan (czy nadal działa).
W NSThread
klasa obsługuje metoda zwana cancel
, które mogą być wywoływane z dowolnego wątku, który następnie ustawia cancelled
właściwość YES
w sposób bezpieczny wątku. Implementacja wątku może wyszukiwać (i / lub obserwować) cancelled
właściwość i wychodzić z main
metody. Można to wykorzystać do płynnego zamknięcia wątku roboczego.
// 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];
Magazyn lokalny wątków
Każdy wątek ma dostęp do słownika zmiennego, który jest lokalny dla bieżącego wątku. Pozwala to na buforowanie informacji w łatwy sposób bez potrzeby blokowania, ponieważ każdy wątek ma swój własny słownik mutable:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
Słownik jest automatycznie zwalniany po zakończeniu wątku.