iOS 26 приносит Swiftui-подобную реактивность в uikit с @observable

iOS 26 приносит Swiftui-подобную реактивность в uikit с @observable

8 августа 2025 г.

С iOS 26 Apple принесла одну из самых любимых особенностей Swiftui в Uikit-долгожданную способность наблюдать напрямую в слое пользовательского интерфейса. В сочетании с новымupdateProperties()Метод жизненного цикла, разработчики UIKIT теперь могут наслаждаться преимуществами реактивного программирования, которые разработчики Swiftui в течение многих лет бредят.


Перед iOS 26


До iOS 26 обновление пользовательского интерфейса в UIKIT обычно опирается на методы, подобные тем, которые показаны ниже.


final class ViewController: UIViewController {
    private var data: UserData? {
        didSet { updateUI() }
    }

    private func updateUI() {
        usernameLabel.text = data?.username
        userImageView.image = data?.image

        setNeedsLayout()
    }
}


ЕслиupdateUIМетод не был вызван, пользовательский интерфейс не обновлялся соответственно. С другой стороны, называя его слишком часто может негативно повлиять на производительность. К счастью, эта давняя дилемма наконец-то была решена.


Внедрение автоматического отслеживания наблюдений


iOS 26 представляет Swift's@ObservableМакро до uikit, предлагая полные возможности автоматического отслеживания. Когда доступ к наблюдаемым свойствам доступны в рамках обозначенных методов uikit, структура автоматически устанавливает зависимости и гарантирует, что представления неверны и обновляются при изменении этих свойств.


@Observable class DataModel {
    var image: UIImage
    var username: String
}

final class UserViewController: UIViewController {
    var dataModel: DataModel
    var usernameLabel: UILabel
    var userImage: UIImageView

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        // UIKit automatically tracks these properties
        userImage.image = dataModel.image
        usernameLabel.text = dataModel.username
    }
}


Больше не нужно звонитьsetNeedsLayout()или вручную запускать методы обновления. Просто применив@Observableмакрос для вашего класса данных и реализацияviewWillLayoutSubviewsМетод, uikit будет:


  1. Автоматически отслеживать зависимости, такие какimageиusernameВо время начального макета,
  2. Недействительно взглянуть на точку зрения, когда эти свойства изменятся, и
  3. RevokeviewWillLayoutSubviews()Для обеспечения того, чтобы пользовательский интерфейс остался в синхронизации.


Облегчает использование CollectionView


@Observable class ItemModel {
    var title: String
    var subtitle: String
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
    let itemModel = itemModel(for: indexPath)

    cell.configurationUpdateHandler = { cell, state in
        var content = UIListContentConfiguration.subtitleCell()
        content.text = listItemModel.title
        content.secondaryText = listItemModel.subtitle
        cell.contentConfiguration = content
    }
    return cell
}


Готовы модернизировать приложения uikit?


Чтобы в полной мере воспользоваться новыми реактивными возможностями, введенными в iOS 26, начните с обновления вашего проекта до iOS 26 SDK и перекомплектоспособности ваших существующих приложений.

Затем определите области в вашей кодовой базе, которые полагаются на ручные шаблоны обновления пользовательского интерфейса. Преобразовать подходящие модели данных для использования@Observableмакро и реализуйтеupdateProperties()Метод обработки логики обновления, специфичной для свойств. Для повышения отзывчивости пользовательского интерфейса и более плавной анимации используйтеflushUpdates()где это уместно.

Uikit вступает в новую эру-более реактивную, исполнительную и подходящую для разработчиков, чем когда-либо прежде. Добро пожаловать в будущее развития iOS.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE