NSThread — это класс в Foundation, представляющий поток выполнения (thread) в macOS и iOS. Это объектно-ориентированная обёртка над POSIX-потоками, предоставляющая более удобный API для работы с многопоточностью в Objective-C и Swift.
let thread = Thread {
print("Выполняюсь в кастомном потоке")
Thread.current.name = "Мой поток"
}
thread.start()
Thread.detachNewThread {
// Долгая обработка данных
let result = processData()
// Возврат на главный поток
DispatchQueue.main.async {
updateUI(with: result)
}
}
// Установка приоритета
Thread.current.threadPriority = 0.8
// Проверка текущего потока
if Thread.isMainThread {
print("Это главный поток")
}
Метод/Свойство | Описание |
---|---|
start() | Запускает поток |
cancel() | Помечает поток для отмены |
isExecuting | Проверяет, выполняется ли поток |
isCancelled | Проверяет, был ли поток отменён |
threadPriority | Устанавливает приоритет потока (от 0.0 до 1.0) |
qualityOfService | Устанавливает QoS (аналог QoS в GCD) |
name | Имя потока (удобно для отладки) |
current | Возвращает текущий поток |
isMainThread | Проверяет, является ли поток главным |
class NetworkThread: Thread {
private var task: URLSessionDataTask?
override func main() {
let url = URL(string: "https://api.example.com/data")!
task = URLSession.shared.dataTask(with: url) { data, _, _ in
// Обработка данных
self.performSelector(onMainThread: #selector(self.updateUI), with: data, waitUntilDone: false)
}
task?.resume()
// Бесконечный цикл для RunLoop
while !isCancelled {
RunLoop.current.run(mode: .default, before: .distantFuture)
}
}
@objc func updateUI(with data: Data) {
// Обновление UI
}
override func cancel() {
task?.cancel()
super.cancel()
}
}
// Использование
let networkThread = NetworkThread()
networkThread.start()
// ...
networkThread.cancel()
Преимущества:
Недостатки:
GCD (Grand Central Dispatch):
DispatchQueue.global().async {
// Фоновая работа
}
OperationQueue:
let queue = OperationQueue()
queue.addOperation {
// Фоновая работа
}
Swift Concurrency (async/await):
Task {
await fetchData()
}
NSThread — это низкоуровневый API для работы с потоками в iOS/macOS. Хотя в современных приложениях предпочтительнее использовать GCD, OperationQueue или Swift Concurrency, понимание NSThread важно для работы с legacy-кодом и глубокого понимания многопоточности в Apple экосистеме.