#iOSКомпас 🧭
7️⃣7️⃣ Завдання 77
Чому погано завантажувати головний потік і як цього уникнути?
З вами знову той самий автор каналу @badlinkschannel. Не забувайте підписатися. А ми продовжуємо наші яблучні історіі.
🤔 Головний потік відповідає за оновлення користувацького інтерфейсу (UI) і обробку взаємодії з користувачем. Якщо цей потік блокується, програма може стати нечутливою, що спричиняє затримки або навіть повну заморозку інтерфейсу.
🔣 Проблеми завантаження головного потоку
➖ Замороження інтерфейсу: Якщо головний потік зайнятий тривалими операціями, UI не буде оновлюватися, що викличе затримки або зависання.
➖ Негативний досвід користувача: Затримки та лаги знижують задоволення від взаємодії з додатком.
➖ Можливі аварійні завершення: Тривале блокування головного потоку може призвести до завершення програми, оскільки iOS розцінює її як не реагуючу.
🔣 Як уникнути завантаження головного потоку
➖ Використання Grand Central Dispatch (GCD): GCD дозволяє виконувати асинхронні задачі у фоновому режимі.
DispatchQueue.global(qos: .background).async {
// Тривала операція
let result = performHeavyComputation()
DispatchQueue.main.async {
// Оновлення UI з результатом
updateUI(with: result)
}
}
➖ OperationQueue: Цей інструмент забезпечує високорівневий інтерфейс для асинхронних завдань, дозволяючи встановлювати пріоритети й залежності.
let backgroundQueue = OperationQueue()
backgroundQueue.addOperation {
// Тривала операція
let result = performHeavyComputation()
OperationQueue.main.addOperation {
// Оновлення UI з результатом
updateUI(with: result)
}
}
➖ URLSession для мережевих запитів: URLSession автоматично виконує мережеві запити у фоновому режимі.
let url = URL(string: "https://example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
// Обробка даних
DispatchQueue.main.async {
// Оновлення UI
updateUI(with: data)
}
}
task.resume()
➖ Core Data: Для роботи з базою даних варто використовувати фонові контексти (background contexts).
let backgroundContext = persistentContainer.newBackgroundContext()
backgroundContext.perform {
let fetchRequest: NSFetchRequest = Entity.fetchRequest()
let results = try? backgroundContext.fetch(fetchRequest)
DispatchQueue.main.async {
// Оновлення UI з результатами
updateUI(with: results)
}
}
@Zatishna_Galera
7️⃣7️⃣ Завдання 77
Чому погано завантажувати головний потік і як цього уникнути?
З вами знову той самий автор каналу @badlinkschannel. Не забувайте підписатися. А ми продовжуємо наші яблучні історіі.
🤔 Головний потік відповідає за оновлення користувацького інтерфейсу (UI) і обробку взаємодії з користувачем. Якщо цей потік блокується, програма може стати нечутливою, що спричиняє затримки або навіть повну заморозку інтерфейсу.
🔣 Проблеми завантаження головного потоку
➖ Замороження інтерфейсу: Якщо головний потік зайнятий тривалими операціями, UI не буде оновлюватися, що викличе затримки або зависання.
➖ Негативний досвід користувача: Затримки та лаги знижують задоволення від взаємодії з додатком.
➖ Можливі аварійні завершення: Тривале блокування головного потоку може призвести до завершення програми, оскільки iOS розцінює її як не реагуючу.
🔣 Як уникнути завантаження головного потоку
➖ Використання Grand Central Dispatch (GCD): GCD дозволяє виконувати асинхронні задачі у фоновому режимі.
DispatchQueue.global(qos: .background).async {
// Тривала операція
let result = performHeavyComputation()
DispatchQueue.main.async {
// Оновлення UI з результатом
updateUI(with: result)
}
}
➖ OperationQueue: Цей інструмент забезпечує високорівневий інтерфейс для асинхронних завдань, дозволяючи встановлювати пріоритети й залежності.
let backgroundQueue = OperationQueue()
backgroundQueue.addOperation {
// Тривала операція
let result = performHeavyComputation()
OperationQueue.main.addOperation {
// Оновлення UI з результатом
updateUI(with: result)
}
}
➖ URLSession для мережевих запитів: URLSession автоматично виконує мережеві запити у фоновому режимі.
let url = URL(string: "https://example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
// Обробка даних
DispatchQueue.main.async {
// Оновлення UI
updateUI(with: data)
}
}
task.resume()
➖ Core Data: Для роботи з базою даних варто використовувати фонові контексти (background contexts).
let backgroundContext = persistentContainer.newBackgroundContext()
backgroundContext.perform {
let fetchRequest: NSFetchRequest = Entity.fetchRequest()
let results = try? backgroundContext.fetch(fetchRequest)
DispatchQueue.main.async {
// Оновлення UI з результатами
updateUI(with: results)
}
}
@Zatishna_Galera