首页 > 解决方案 > 数据立即解除分配

问题描述

我目前正在为我的应用程序开发标题 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 感到更舒服了,但是像这样的小问题一直在破坏我的信心,哈哈。感谢您提供的任何可教的时刻。

标签: jsonswiftswiftui

解决方案


我找到了,请按照以下步骤操作:

  1. 根据您的类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!"
    }]
    }
    

    尝试使用此网址

  2. 您应该将.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()
    }
    }
    

推荐阅读