Swift Academy · Урок

Минимизация повторной оценки body

Сокращайте ненужные пересчёты представлений.

Урок 2 из 413 шагов

«Минимизация повторной оценки body» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

body часто вычисляется повторно

SwiftUI вызывает body представления всякий раз, когда изменяются его входные данные. Сложное или чрезмерно связанное содержимое body вычисляется слишком часто, что снижает производительность.

Что вызывает повторное вычисление

body вычисляется заново, когда изменяется любое читаемое им значение @State, @Binding, наблюдаемый объект или значение окружения, а также когда родитель передаёт новые значения.

struct Row: View {
    let title: String // changes -> body re-runs
    var body: some View { Text(title) }
}

Сузьте область наблюдения

Если представление читает целиком большую модель, любое изменение этой модели повторно вычисляет его body. Передавайте только конкретные значения, необходимые представлению.

// Instead of passing the whole model:
struct Price: View {
    let amount: Decimal // narrow input
    var body: some View { Text(amount, format: .currency(code: "USD")) }
}

Разделяйте большие представления

Разделяйте большое содержимое body на небольшие дочерние представления. SwiftUI повторно вычисляет только дочерние представления, входные данные которых действительно изменились, а не весь экран.

struct Screen: View {
    var body: some View {
        VStack {
            Header()   // re-runs only if its inputs change
            ItemList()
            Footer()
        }
    }
}

@Observable и отслеживание на уровне свойств

С макросом @Observable SwiftUI отслеживает, какие именно свойства читает представление. Представление, читающее только model.name, игнорирует изменения model.count.

@Observable final class Model {
    var name = ""
    var count = 0
}
// A view reading only name won’t re-run when count changes

Не выполняйте работу в body

Содержимое body должно недорого описывать пользовательский интерфейс. Ресурсоёмкие вычисления, такие как сортировка и фильтрация, должны находиться в модели или кэшированном свойстве, а не выполняться заново при каждом вызове body.

// Bad: sort inside body (runs every recompute)
// Good: sort once in the model, expose sorted array

Стабильные замыкания и входные данные

Передача заново созданного массива или замыкания при каждой отрисовке может нарушить проверки равенства SwiftUI. Выносите стабильные значения, чтобы входные данные оставались равными при повторных вычислениях.

// Hoist constants out of body
private let columns = [GridItem(.flexible())]

Остерегайтесь затратных инициализаторов

Инициализатор представления init может выполняться много раз. Избегайте тяжёлой работы в нём: SwiftUI часто создаёт значения представлений, даже если не отрисовывает их.

struct Card: View {
    init(_ item: Item) { /* keep this trivial */ }
    var body: some View { Text("Card") }
}

Чтение значений окружения вызывает обновления

Чтение значения окружения подписывает представление на его изменения. Читайте значения окружения только там, где они нужны, в самом маленьком дочернем представлении, чтобы ограничить область повторного вычисления.

@Environment(\.colorScheme) private var scheme

Ленивые контейнеры

Используйте LazyVStack/LazyHStack и List, чтобы строки за пределами экрана создавались только при необходимости, сокращая количество вызовов body для больших коллекций.

ScrollView {
    LazyVStack {
        ForEach(items) { RowView(item: $0) }
    }
}

Сначала измеряйте, затем оптимизируйте

Не пытайтесь угадать, содержимое какого body выполняется медленно. Используйте инструмент SwiftUI, чтобы найти представления с большим количеством вычислений body, и применяйте эти методы именно к ним.

Быстрая проверка: повторное вычисление

Проверьте понимание повторного вычисления body.

Итоги: сокращение повторных вычислений body

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

Всегда подтверждайте наличие узких мест с помощью инструмента SwiftUI перед оптимизацией.

Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Минимизация повторной оценки body» бесплатный?

Да — полный текст урока «Минимизация повторной оценки body» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Минимизация повторной оценки body»?

Сокращайте ненужные пересчёты представлений. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Минимизация повторной оценки body»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Понимание идентичности представлений
  2. Минимизация повторной оценки body
  3. Сравнимые представления и область действия @State
  4. Профилирование с помощью инструмента SwiftUI
← Назад к Swift Academy