Я хочу понять полезность использования AsyncStream, когда в iOS 17 появился макрос @Observable, с помощью которого мы можем напрямую наблюдать изменения значения любой переменной в модели (и отслеживание наблюдений может происходить даже вне Представление SwiftUI). Поэтому, если я наблюдаю непрерывный поток значений, например ход загрузки файла с использованием AsyncStream в представлении SwiftUI, то же самое можно наблюдать и в том же представлении SwiftUI, используя onChange(of:initial) прогресса загрузки (хранится как свойство в объекте модели). Я ищу преимущества, недостатки и ограничения обоих подходов.
В частности, мой вопрос касается примера кода AVCam от Apple, где они наблюдают несколько следующих состояний. Это делается в классе CameraModel, который прикреплен к представлению SwiftUI.
// MARK: - Internal state observations
// Set up camera's state observations.
private func observeState() {
Task {
// Await new thumbnails that the media library generates when saving a file.
for await thumbnail in mediaLibrary.thumbnails.compactMap({ $0 }) {
self.thumbnail = thumbnail
}
}
Task {
// Await new capture activity values from the capture service.
for await activity in await captureService.$captureActivity.values {
if activity.willCapture {
// Flash the screen to indicate capture is starting.
flashScreen()
} else {
// Forward the activity to the UI.
captureActivity = activity
}
}
}
Task {
// Await updates to the capabilities that the capture service advertises.
for await capabilities in await captureService.$captureCapabilities.values {
isHDRVideoSupported = capabilities.isHDRSupported
cameraState.isVideoHDRSupported = capabilities.isHDRSupported
}
}
Task {
// Await updates to a person's interaction with the Camera Control HUD.
for await isShowingFullscreenControls in await captureService.$isShowingFullscreenControls.values {
withAnimation {
// Prefer showing a minimized UI when capture controls enter a fullscreen appearance.
prefersMinimizedUI = isShowingFullscreenControls
}
}
}
}
Если мы видим структуру CaptureCapabilities, это небольшая структура с двумя членами типа Bool. Эти изменения можно было непосредственно наблюдать с помощью представления SwiftUI. Интересно, есть ли какое-то конкретное преимущество или причина использовать здесь AsyncStream и постоянно перебирать изменения в цикле for.
/// A structure that represents the capture capabilities of `CaptureService` in
/// its current configuration.
struct CaptureCapabilities {
let isLivePhotoCaptureSupported: Bool
let isHDRSupported: Bool
init(isLivePhotoCaptureSupported: Bool = false,
isHDRSupported: Bool = false) {
self.isLivePhotoCaptureSupported = isLivePhotoCaptureSupported
self.isHDRSupported = isHDRSupported
}
static let unknown = CaptureCapabilities()
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... in-swiftui
Использование макроса AsyncStream и @Observable в SwiftUI [закрыто] ⇐ IOS
Программируем под IOS
-
Anonymous
1734943638
Anonymous
Я хочу понять полезность использования AsyncStream, когда в iOS 17 появился макрос @Observable, с помощью которого мы можем напрямую наблюдать изменения значения любой переменной в модели (и отслеживание наблюдений может происходить даже вне Представление SwiftUI). Поэтому, если я наблюдаю непрерывный поток значений, например ход загрузки файла с использованием AsyncStream в представлении SwiftUI, то же самое можно наблюдать и в том же представлении SwiftUI, используя onChange(of:initial) прогресса загрузки (хранится как свойство в объекте модели). Я ищу преимущества, недостатки и ограничения обоих подходов.
В частности, мой вопрос касается примера кода AVCam от Apple, где они наблюдают несколько следующих состояний. Это делается в классе CameraModel, который прикреплен к представлению SwiftUI.
// MARK: - Internal state observations
// Set up camera's state observations.
private func observeState() {
Task {
// Await new thumbnails that the media library generates when saving a file.
for await thumbnail in mediaLibrary.thumbnails.compactMap({ $0 }) {
self.thumbnail = thumbnail
}
}
Task {
// Await new capture activity values from the capture service.
for await activity in await captureService.$captureActivity.values {
if activity.willCapture {
// Flash the screen to indicate capture is starting.
flashScreen()
} else {
// Forward the activity to the UI.
captureActivity = activity
}
}
}
Task {
// Await updates to the capabilities that the capture service advertises.
for await capabilities in await captureService.$captureCapabilities.values {
isHDRVideoSupported = capabilities.isHDRSupported
cameraState.isVideoHDRSupported = capabilities.isHDRSupported
}
}
Task {
// Await updates to a person's interaction with the Camera Control HUD.
for await isShowingFullscreenControls in await captureService.$isShowingFullscreenControls.values {
withAnimation {
// Prefer showing a minimized UI when capture controls enter a fullscreen appearance.
prefersMinimizedUI = isShowingFullscreenControls
}
}
}
}
Если мы видим структуру CaptureCapabilities, это небольшая структура с двумя членами типа Bool. Эти изменения можно было непосредственно наблюдать с помощью представления SwiftUI. Интересно, есть ли какое-то конкретное преимущество или причина использовать здесь AsyncStream и постоянно перебирать изменения в цикле for.
/// A structure that represents the capture capabilities of `CaptureService` in
/// its current configuration.
struct CaptureCapabilities {
let isLivePhotoCaptureSupported: Bool
let isHDRSupported: Bool
init(isLivePhotoCaptureSupported: Bool = false,
isHDRSupported: Bool = false) {
self.isLivePhotoCaptureSupported = isLivePhotoCaptureSupported
self.isHDRSupported = isHDRSupported
}
static let unknown = CaptureCapabilities()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79301741/using-asyncstream-vs-observable-macro-in-swiftui[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия