【发布时间】:2021-01-04 23:58:11
【问题描述】:
我开始学习 SwiftUI 开发,我正在制作我的第一个基于 SwiftUI 的基本新闻应用程序,我计划将其开源,但我目前陷入困境。我一直在阅读 Apple 的文档并查看有关如何使用 combine 等自动处理 SwiftUI 中的数据更改的示例。我发现了一个 article,它假设会自动更新列表。我无法看到任何即时数据更改或正在记录的任何内容。
我使用与 NewsAPI 相同的结构,但作为示例,我已将其上传到 GitHub repo。我做了一个小项目并尝试更新我的存储库中的数据并尝试查看我的数据中所做的任何更改。老实说,我正在尽我最大的努力,并且可以真正使用一些指针或更正我的错误可能是什么。我认为我的困惑在于@ObservedObject 和@Published 以及如何处理我的内容视图中的任何更改。这篇文章没有显示他们为处理数据更改所做的任何事情,所以也许我遗漏了什么?
import Foundation
import Combine
struct News : Codable {
var articles : [Article]
}
struct Article : Codable,Hashable {
let description : String?
let title : String?
let author: String?
let source: Source
let content: String?
let publishedAt: String?
}
struct Source: Codable,Hashable {
let name: String?
}
class NewsData: ObservableObject {
@Published var news: News = News(articles: [])
init() {
guard let url = URL(string: "https://raw.githubusercontent.com/ca13ra1/data/main/data.json") else { return }
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let response = try? JSONDecoder().decode(News.self, from: data) {
DispatchQueue.main.async() {
self.news = response
print("data called")
}
}
}
}
.resume()
}
}
我的观点
import SwiftUI
import Combine
struct ContentView: View {
@ObservedObject var data: NewsData
var body: some View {
List(data.news.articles , id: \.self) { article in
Text(article.title ?? "")
}
}
}
【问题讨论】:
-
你说的自动更新列表是什么意思?它对我有用(我只将
@ObservedObject var data: NewsData更改为@ObservedObject var data = NewsData())。 -
@pawello2222 如果我将另一个项目添加到我的 json 数据中,我的视图中的列表会反映这些更改吗?我不想运行计时器来调用更新,这就是为什么我假设如果我的列表中的数据看到来自
@Publishedvar 的任何更改,它就会被更新。我是我的应用程序,我使用的是相对函数,它没有更新,也没有加载任何新文章而不杀死应用程序。 -
不,如果您向 JSON 添加其他项目,您的应用将不会再次自动调用
URLSession.shared.dataTask。@Published仅表示如果此特定属性发生更改,将刷新视图。 -
@pawello2222 那么这篇文章真的不起作用吗?我只是很难弄清楚当数据发生变化时如何正确处理数据变化。我已经被这个问题困扰了好几天了,无法解决。计时器似乎是个坏主意,拉动刷新对我来说似乎很奇怪,刷新按钮也不是我想要的。
-
我认为他们在文章中的意思是
List最初是空的,使用Combine您可以使用从您的 URL 获取的数据自动填充它。但不会自动获取这些数据。