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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow