當我更新 JSON API 時,應用程式中的資料不會立即更新,是否可以添加一個按鈕來重置快取或讓資料在一段時間后自動更新?
struct Course: Hashable, Codable {
let name: String
}
class ViewModel: ObservableObject {
@Published var courses: [Course] = []
func fetch() {
guard let url = URL(string: "JSON URL") else {return}
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
guard let data = data, error == nil else {return}
do {
let courses = try JSONDecoder().decode([Course].self, from: data)
DispatchQueue.main.async {
self?.courses = courses
}
}
catch {
print(error)
}
}
task.resume()
}
}
看法
struct Data: View {
@StateObject var viewModel = ViewModel()
let columns: [GridItem] = [
GridItem(.flexible(), spacing: nil, alignment: nil),
GridItem(.flexible(), spacing: nil, alignment: nil)
]
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: columns) {
ForEach(viewModel.courses, id: \.self) { course in
VStack {
Text(course.name)
.foregroundColor(.white)
}
.frame(width: 90, height: 90)
.background(Color.gray)
}
}
}
.onAppear {
viewModel.fetch()
}
}
}
如何重置快取并更新從 JSON API 獲得的資料,我將不勝感激
uj5u.com熱心網友回復:
在我開始提出解決方案之前,讓我建議避免使用Data
視圖名稱:這是 Swift 型別的名稱。
如果您可以為 iOS 15 部署,SwiftUI 有一個.refreshable()
修飾符,它會在用戶拉下視圖時呼叫一段代碼。這可用于獲取資料。
您可以通過此鏈接找到適當的資訊。
以下是你可以如何使用它(它適用于串列和導航視圖,看看它如何與網格一起使用):
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: columns) {
ForEach(viewModel.courses, id: \.self) { course in
VStack {
Text(course.name)
.foregroundColor(.white)
}
.frame(width: 90, height: 90)
.background(Color.gray)
}
}
// Use this modifier to fetch data when the user pulls the view down
.refreshable {
viewModel.fetch()
}
}
.onAppear {
viewModel.fetch()
}
}
要改為呼叫計時器,您需要在視圖模型中添加以下內容:
// Inside the view model
private var timer = Timer()
init() {
// This example fetches data every 60 seconds
timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] _ in
guard let strongSelf = self else { return }
Task {
await strongSelf.fetch()
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470114.html