可以使用Combine框架中的AsyncSequence和Publishers中的PublishSubject解决AsyncStream过度刷新的问题。
示例代码:
import Combine
class ViewModel {
let data = (1...10).map { "Test \($0)" }
var publisher = PassthroughSubject()
func fetchData() {
for item in data {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.publisher.send(item)
}
}
}
}
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("Loaded data:")
.padding()
ScrollView {
LazyVStack {
AsyncSequence(initial: viewModel.publisher) { subject in
subject
}
.map { Text($0) }
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.onAppear {
viewModel.fetchData()
}
}
}
上述代码通过使用PassthroughSubject
来定期发送数据,并使用AsyncSequence
实现异步拉取数据的效果,在视图中使用了LazyVStack
实现了CollectionView的效果。
在这种方式下,视图立即显示并正常运行,而不会频繁运行更新。