swiftui开发页面加载发送请求初始化@State变量
在SwiftUI中,你不能直接在init
中更新@State
变量,因为@State
是由SwiftUI框架管理的,初始化时不允许直接修改。所以需要在onAppear发送请求然后修改@State状态。
在SwiftUI中,如果希望在页面加载时立即发送网络请求,可以使用onAppear
修饰符来触发请求。
以下是完整示例,展示如何在SwiftUI页面加载时使用Alamofire获取GitHub仓库中指定文件的SHA。
1. 添加Alamofire依赖
在Package.swift
或Xcode的Swift Packages
中添加Alamofire
:
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.0.0")
]
2. SwiftUI页面加载时发送请求
import SwiftUI
import Alamofire
struct ContentView: View {
@State private var sha: String = "Loading..."
var body: some View {
VStack {
Text("File SHA")
.font(.title)
Text(sha)
.font(.body)
.padding()
}
.onAppear {
fetchFileSHA(owner: "apple", repo: "swift", path: "README.md")
}
}
// 网络请求方法
func fetchFileSHA(owner: String, repo: String, path: String) {
let url = "https://api.github.com/repos/\(owner)/\(repo)/contents/\(path)"
// 可选:添加token提升访问速率限制
let headers: HTTPHeaders = [
"Authorization": "token YOUR_PERSONAL_ACCESS_TOKEN"
]
AF.request(url, headers: headers)
.validate() // 验证请求是否成功(状态码200-299)
.responseDecodable(of: GitHubFileResponse.self) { response in
switch response.result {
case .success(let fileData):
sha = fileData.sha
case .failure(let error):
sha = "Error: \(error.localizedDescription)"
}
}
}
}
// GitHub API 响应模型
struct GitHubFileResponse: Decodable {
let sha: String
}
3. 代码说明
onAppear
:页面加载时触发,确保首次显示时就发送网络请求。@State
:使用@State
管理SHA的状态,更新后自动刷新页面。validate()
:确保状态码在200-299之间,保证请求成功。responseDecodable
:直接解析返回的JSON为GitHubFileResponse
模型。
4. 示例返回的JSON格式
GitHub API返回的JSON示例如下:
{
"name": "README.md",
"path": "README.md",
"sha": "abc123def456",
"size": 123,
"type": "file",
"content": "SGVsbG8gd29ybGQ=",
"encoding": "base64"
}
5. 注意事项
-
访问令牌(Token):如果请求频繁,可以在GitHub创建一个个人访问令牌并替换
YOUR_PERSONAL_ACCESS_TOKEN
,否则可能会遇到API访问限制。 -
私有仓库访问:访问私有仓库必须提供访问令牌,否则返回404或403错误。
-
请求优化:对于大型文件,GitHub可能返回内容的base64编码,如果只需SHA,响应速度较快。