Главное правило: Все операции, изменяющие визуальное состояние UI, должны выполняться на главном потоке. UIKit не является потокобезопасным.
// ОПАСНО: Это вызовет проблемы
DispatchQueue.global().async {
self.label.text = "New Text" // CRASH или глюки интерфейса
self.view.backgroundColor = .red // Тоже опасно
}
DispatchQueue.global(qos: .userInitiated).async {
let image = self.processImage(rawImage) // Ресайз/фильтрация
DispatchQueue.main.async {
self.imageView.image = image // Установка только на main
}
}
DispatchQueue.global().async {
let currentText = self.label.text // Чтение обычно безопасно
let currentSize = self.view.frame.size // Но может быть устаревшим
// Важно: frame может измениться на main потоке!
}
// Создание UIImage из данных - безопасно
DispatchQueue.global().async {
if let image = UIImage(data: rawImageData) {
DispatchQueue.main.async {
self.imageView.image = image
}
}
}
DispatchQueue.global().async {
let size = text.calculateSize(for: maxWidth: 300) // Кастомный расчет
DispatchQueue.main.async {
self.label.frame.size = size // Применяем на main
}
}
DispatchQueue.global().async {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
defer { UIGraphicsEndImageContext() }
// Рисование в контексте
let image = UIGraphicsGetImageFromCurrentImageContext()
DispatchQueue.main.async {
self.imageView.image = image
}
}
Task {
let processedImage = await processImageAsync(rawImage)
await MainActor.run {
self.imageView.image = processedImage
}
}
Метки для автоматического выполнения на главном потоке:
@MainActor
func updateUI(with data: Data) {
self.label.text = data.text // Гарантированно на main
}
DispatchQueue.main.async
для UI-обновленийDispatchQueue.global(qos: .userInitiated)
MainActor
и async/await
assert(Thread.isMainThread, "Этот метод должен вызываться на главном потоке")
несмотря на то, что некоторые подготовительные операции можно выполнять вне главного потока, все изменения, влияющие на отображение UI, должны выполняться строго на главном потоке. Современные механизмы (MainActor, async/await) упрощают соблюдение этого правила.