Использование макроса AsyncStream и @Observable в SwiftUI [закрыто]IOS

Программируем под IOS
Ответить
Anonymous
 Использование макроса AsyncStream и @Observable в SwiftUI [закрыто]

Сообщение 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()
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... in-swiftui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»