swiftui 网络请求
时间: 2024-10-21 22:13:10 浏览: 33
SwiftUI 啤酒 网络请求json 无限载入刷新更新Load
SwiftUI 中处理网络请求通常通过 Combine 框架的 `URLSession` 和 `Defer` 结合使用来实现非阻塞、异步的网络操作。以下是一个简单的步骤:
1. **引入依赖**:首先需要导入 SwiftUI 和 Combine 的相关库,例如 `Combine`, `URLSession`。
```swift
import SwiftUI
import Combine
```
2. **创建 publisher**:你可以创建一个 publishers,比如 `DataPublisher`,它会响应来自服务器的数据更新。
```swift
struct ContentView: View {
@StateObject var networkViewModel = NetworkViewModel()
// ...
}
```
```swift
class NetworkViewModel: ObservableObject {
let url = URL(string: "https://example.com")!
private let session = URLSession.shared
@Published var data: Data?
@Published var loading: Bool = true
@Published var error: Error?
private var cancellable: AnyCancellable?
init() {
_data = .publisher(sink: { [weak self] data in
self?.onReceive(data) { data in
// 解析数据
DispatchQueue.main.async {
self?.data = data
self?.loading = false
}
}
})
cancellable = URLSession.shared.dataTask(with: url) { data, response, error in
DispatchQueue.main.async {
self?.error = error
self?.loading = false
}
}.sink-cancelled()
}
deinit {
cancellable.cancel()
}
}
```
3. **处理错误和取消订阅**:记得在视图离开时取消数据任务,以及在遇到错误时更新 UI。
4. **显示结果**:在 SwiftUI 的视图里,你可以使用 `if-let` 来展示数据,并使用 `LoadingView` 或者 `.onAppear(perform:)` 动态改变状态。
```swift
VStack {
if let data = networkViewModel.data {
// 显示数据显示的部分
} else if let error = networkViewModel.error {
// 显示错误信息
} else {
LoadingView(isLoading: $networkViewModel.loading)
}
}
```
阅读全文