Данные немедленно освобождены - PullRequest
0 голосов
/ 28 февраля 2020

В настоящее время я работаю над элементом пользовательского интерфейса заголовка для своего приложения, и у меня возникла проблема с немедленным удалением данных. Я пытался заставить консоль распечатать любые данные, которые он получает, но я даже не видел этого в консоли. Я пытаюсь добиться того, чтобы приложение подключилось к своему целевому «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» и читает массив. Затем эта информация подключается, и для каждого индекса результатов, определяемого идентификатором, должна отображаться карточка с изображением главной истории, заголовком статьи и краткой сводкой. Я начинаю чувствовать себя немного более комфортно со Свифтом, но такие маленькие икоты продолжают разрушать мою уверенность, ха-ха. Спасибо за любые обучающие моменты, которые вы можете предоставить.

1 Ответ

1 голос
/ 28 февраля 2020

Я нашел его, выполните следующие действия:

  1. В соответствии с вашим классом Ответ , ваша служба должна вернуть это 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!"
    }]
    }
    

    Попробуйте, используя этот url

  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()
    }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...