json - 数据立即解除分配
问题描述
我目前正在为我的应用程序开发标题 UI 元素,并且我的数据被立即释放时遇到了问题。我一直试图让控制台打印它接收到的任何数据,但我什至在控制台中都没有看到。我想要实现的是让应用程序连接到其目标“CDN”,然后为头条新闻提取数据。使用 PHP 我正在执行一个 SQL 查询来生成一个数组,然后应用程序将使用该数组。运行所述脚本时,会生成以下数组。
{"id":"1","title":"Meet ergoWare","header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg","summary":"GBA's New Ergonomic Portal!"}
令人惊叹的数组是的,所以下一部分将在应用程序中读取和编译以创建标题卡片,但问题是我无法加载数据。我知道我缺少一些东西,但是如果没有编译器将我指向我需要的方向,我就在摸索它。所以这里是 Swift 代码。
import SwiftUI
struct Response: Codable {
var results: [Article]
}
struct Article: Codable, Identifiable {
var id: Int
var title: String
var header_image: String
var summary: String
}
struct HeadlineUI: View {
@State var results = [Article]()
var CDNLink: String
var body: some View {
ScrollView(.horizontal) {
HStack(spacing: 20) {
ForEach(results) { result in
CardView(image: result.header_image, summary: result.summary, heading: result.title)
}
.onAppear(perform: { self.loadData() })
}
}
}
func loadData() {
guard let url = URL(string: CDNLink) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
DispatchQueue.main.async {
self.results = decodedResponse.results
print(self.results)
}
return
}
}
print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
}.resume()
}
}
struct HeadlineUI_Previews: PreviewProvider {
static var previews: some View {
HeadlineUI(CDNLink: "https://gba.ergoware.io/cdn?funct=fetchNews")
}
}
所以应该发生的是它连接到“CDN”并读取数组。然后插入该信息,对于由 id 定义的结果的每个索引,应显示一张卡片,其中包含头条新闻图像、文章标题和简短摘要。我开始对 Swift 感到更舒服了,但是像这样的小问题一直在破坏我的信心,哈哈。感谢您提供的任何可教的时刻。
解决方案
我找到了,请按照以下步骤操作:
根据您的类Response,您的服务应返回此 JSON:
{ "results" : [{ "id":1, "title":"Meet ergoWare", "header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg", "summary":"GBA's New Ergonomic Portal!" }] }
尝试使用此网址
您应该将.onAppear放在HStack中,而不是 ForEach 中。这是一个完整的例子:
struct Response: Codable { var results: [Article] } struct Article: Codable, Identifiable { var id: Int var title: String var header_image: String var summary: String } struct HeadlineUI: View { @State var results = [Article]() var CDNLink: String var body: some View { ScrollView(.horizontal) { HStack(spacing: 20) { Text("Response:") ForEach(results) { result in Text(result.title) } }.onAppear(perform: { self.loadData() }) } } func loadData() { guard let url = URL(string: CDNLink) else { print("Invalid URL") return } let request = URLRequest(url: url) URLSession.shared.dataTask(with: request) { data, response, error in if error != nil { print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")") return } else { do { let decodedResponse = try JSONDecoder().decode(Response.self, from: data!) print(decodedResponse) self.results = decodedResponse.results } catch let err { print("Error parsing: \(err)") } } }.resume() } }
推荐阅读
- next.js - Next 带有样式组件的 JS 组件库
- java - 选择新值时获取 SWT Combo 的先前值
- c# - Unity - 避免对同一对象进行多次光线投射以多次运行功能
- python-3.x - 使用填充连接两个十六进制数字?
- python - 如何在字典中打印低于某个百分比的值?
- java - 如何让我的 ADT 堆栈显示其内容
- c# - C# 错误 CS0019,运算符“*”不能应用于“double[]”和“double”类型的操作数
- python-3.x - SciKit-Learn 的分解模块中没有安装 LatentDirichletAllocation
- python - 读取文件 tkinter 中的行
- swiftui - 努力使用 SwiftUI 实现全局通知视图