Поиск…


Создание простого потока

Самый простой способ создать поток - это вызвать селектор «в фоновом режиме». Это означает, что для выполнения селектора создается новый поток. Получающим объектом может быть любой объект, а не только self , но он должен отвечать данному селектору.

- (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.
    }
}

Создать более сложную нить

Использование подкласса NSThread позволяет реализовать более сложные потоки (например, разрешить передачу большего количества аргументов или инкапсулировать все связанные вспомогательные методы в один класс). Кроме того, экземпляр NSThread может быть сохранен в свойстве или переменной и может быть запрошен о его текущем состоянии (он все еще работает).

Класс NSThread поддерживает метод, называемый cancel который может быть вызван из любого потока, который затем устанавливает cancelled свойство в YES поточно-безопасным способом. Реализация потока может запрашивать (и / или наблюдать) cancelled свойство и выходить из его main метода. Это можно использовать для изящного закрытия рабочего потока.

// 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];

Потоковое локальное хранилище

Каждый поток имеет доступ к изменяемому словарю, который является локальным для текущего потока. Это позволяет легко кэшировать информацию без необходимости блокировки, поскольку каждый поток имеет свой собственный выделенный изменяемый словарь:

NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;

Словарь автоматически освобождается, когда поток завершается.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow