SwiftUI 中的状态恢复

问题描述 投票:0回答:1

我正在研究 SwiftUI 应用程序中的状态恢复。我从 Apple 找到了这个示例代码,它使用 ObservableObject 并在对象发生变化时将导航数据存储在 SceneStorage 中。

我想知道如何使用 Observable 类(iOS 17 中的宏)最好地解决这个问题。我会通过使用所需属性的 .values 流来重建它,还是有更聪明的方法。这是我引用的代码片段:

// In Navigation: ObservableObject
var objectWillChangeSequence: AsyncPublisher<Publishers.Buffer<ObservableObjectPublisher>> {
    objectWillChange
        .buffer(size: 1, prefetch: .byRequest, whenFull: .dropOldest)
        .values
}

// In View
.task {
    if let data = data {
        navModel.jsonData = data
    }
    
    for await _ in navModel.objectWillChangeSequence {
        data = navModel.jsonData
    }
}

鉴于我的导航模型有多个导航路径,理论上我可以使用

pathOne.values
构建一个流,并将Latest 与
pathTwo.values
结合使用,但我想知道是否有更直接的方法。当然,我知道理论上我仍然可以像示例代码一样使用 ObservableObject,但如果可行的话我宁愿使用新的 Observable 宏。

ios swift macos swiftui
1个回答
0
投票

我认为Apple示例没有正确的数据流或数据类型,但这应该可以实现您的要求:

.task {
    let stream = AsyncStream {
        await withCheckedContinuation { continuation in
            let _ = withObservationTracking { // let _ required to fix compilation error
                navModel.jsonData
            } onChange: {
                continuation.resume()
            }
        }
        return navModel.jsonData
    }
    // initial value
    data = navModel.jsonData
    // updates
    for await jsonData in stream {
        data = jsonData
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.