Objective-C Language
Многопоточность
Поиск…
Создание простого потока
Самый простой способ создать поток - это вызвать селектор «в фоновом режиме». Это означает, что для выполнения селектора создается новый поток. Получающим объектом может быть любой объект, а не только 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;
Словарь автоматически освобождается, когда поток завершается.