Встречается на 36% собеседований по Mobile

что такое синхронная задача

Синхронная задача — это операция, выполнение которой блокирует текущий поток до её завершения, не позволяя выполняться последующему коду. В iOS-разработке синхронные задачи выполняются последовательно в том же потоке, где они были вызваны, что может приводить к зависанию интерфейса при длительных операциях.

Как это работает

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

Пример на Swift

Рассмотрим пример загрузки данных пользователя:

swift
func loadUserData() {
    let userData = fetchUserData() // Синхронный вызов, блокирующий поток
    updateUI(with: userData) // Этот код выполнится только после завершения fetchUserData()
}

Здесь fetchUserData() — синхронная функция, которая может выполнять сетевой запрос или чтение из базы данных. Пока она работает, поток, в котором вызван loadUserData(), полностью заблокирован. Если это главный поток, интерфейс приложения «замрёт» до тех пор, пока данные не будут получены и updateUI(with:) не обновит экран.

Подводные камни

  • Блокировка главного потока: длительные синхронные операции в главном потоке приводят к зависанию UI и ухудшению пользовательского опыта.
  • Отсутствие параллелизма: синхронные задачи выполняются строго по очереди, что снижает производительность при большом количестве операций.
  • Сложность отмены: прервать синхронную задачу сложно, особенно если она уже начала выполнение.

Когда использовать

Синхронные задачи уместны для коротких операций, которые не влияют на отзывчивость интерфейса: например, простые вычисления, работа с локальными данными небольшого объёма или обновление UI после получения данных. Для длительных операций (сетевые запросы, работа с файлами, тяжёлые вычисления) следует использовать асинхронные подходы: GCD (DispatchQueue.async), OperationQueue или современные async/await.

Коротко

  • Синхронная задача блокирует поток до своего завершения, выполняясь последовательно.
  • В iOS главный поток отвечает за UI, поэтому синхронные длительные операции в нём вызывают «замерзание» интерфейса.
  • Для длительных задач используйте асинхронные механизмы, чтобы сохранить отзывчивость приложения.
  • Синхронное выполнение просто в реализации и подходит для коротких операций, не влияющих на производительность.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы