SwiftUI dev
1.17K subscribers
87 photos
37 videos
1 file
74 links
Mobile development, SwiftUI, Compose, feel free to reach me: @lexkraev
Download Telegram
SwiftUI dev
5️⃣ Как устроен актор, Sendable Типы, которые безопасны для общего параллельного(одновремнного) использования между акторами, называются Sendable. Тип может быть Sendable, если его значение копируется из одного места в другое, и оба места могут безопасно…
6️⃣ Main actor
Когда мы работаем над приложением, нам нужно постоянно думать об основном потоке. Именно здесь происходит рендеринг UI, а также где обрабатываются события взаимодействия с пользователем. Тем не менее, если мы постоянно работаем в главном потоке, скажем, загружаем данные, то наш UI начинает фризить, особенно в случаях плохой связи. Такие операции нужно выносить из главного потока, а потом вызывать DispatchQueue.main.async всякий раз, когда есть конкретная операция, которая должна быть выполнена в основном потоке, например, присвоение в @Published.

func checkedOut(_ booksOnLoan: [Book]) {
booksView.checkedOutBooks = booksOnLoan
}

DispatchQueue.main.async {
checkedOut(booksOnLoan)
}


На самом деле, взаимодействие с основным потоком очень похоже на взаимодействие с актором.
И если мы работаем в основном потоке, то можем безопасно получить доступ и обновить state у UI, а если не на главном, то работать с ним нужно асинхронно. Именно так и работают акторы. Main actor - специальный актор, который представляет главный поток.
Код выше преобразовывается:

@MainActor func checkedOut(_ booksOnLoan: [Book]) {
booksView.checkedOutBooks = booksOnLoan
}

await checkedOut(booksOnLoan)

Главный актор отличается от обычного двумя свойствами:
1. Всю свою синхронизация выполняет через main disptach queue. Это означает, что с точки зрения выполнения на главном акторе логику можно заменить на DispatchQueue.main
2. Так как код и данные, которые нужно выполнять на главном потоке, разбросаны повсюду: SwiftUI, UIKit, фрэймворки, то достаточно указать для этого специальную аннотацию @MainActor (и код выполнить асинхронно на главном потоке).
У типов, помеченных @MainActor, члены и подклассы также будут @MainActor. Это удобно тех частей кода, которые должны взаимодействовать с пользовательским интерфейсом, где большинство все должно выполняться в основном потоке.

#readthis
SwiftUI dev
Protect mutable state with Swift actors https://developer.apple.com/videos/play/wwdc2021/10133/ 1️⃣ Обзор на сессию выложу в виде последовательных постов (номер по порядку смотрите в начале поста), так как инфы оч много, а тема достаточно интересная и нетрививальная.…
👨🏻‍💻Правила изоляции акторов:
1. Актор может читать свои собственные свойства или вызывать свои функции (т.е. используя self) синхронно.
2. Актор может обновлять только свои собственные свойства (и может делать это синхронно). Это означает, что вы можете обновлять свойства только с помощью ключевого слова self.
Попытка обновить свойство другого актора приведет к ошибке компилятора.
3. ☝🏼Считывание свойств между участниками или вызовы функций должны происходить асинхронно с использованием ключевого слова await. 🧐Однако перекрестное чтение неизменяемых свойств может происходить синхронно (тех, что объявлены с помощью let).
👍🏻 Весьма годная статья про акторы
https://apptractor.ru/info/articles/actors-swift-5-5.html

Выдержка:
Одно из лучших объяснений для общения в модели акторов выглядит следующим образом:
Представьте, что каждый актор похож на остров, а наша кодовая база — это мир с островами. Каждый остров может общаться с другим островом, отправляя ему сообщения в бутылке. Каждый остров знает, куда отправить сообщение (то есть адрес другого острова), и именно так работает связь между островами.

#readthis