Я хочу понять полезность использования 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