【问题标题】:Swift API Call using dataTaskPublisher使用 dataTaskPublisher 的 Swift API 调用
【发布时间】:2020-12-25 10:19:31
【问题描述】:

在使用 dataTaskPublisher 和从 API 中提取数据方面取得了各种成功。 我遇到的问题是嵌套 JSON。我可以获取简单的 JSON,但是像 Pokemon API 这样嵌套 JSON 的东西让我很着迷。

任何建议都会很棒。 onappear: // 获取完成是我挂断的部分。

import SwiftUI
import Combine

struct Pokemon: Codable {
    var cards: Card
}

struct Card: Codable {
    var id: String
    var name: String
}


struct ContentView: View {
    @State private var requests = Set<AnyCancellable>()
    @State var pokemon: Pokemon
    
    var body: some View {
        VStack {
            Text("card name here")
        }
        .onAppear {
            let url = URL(string: "https://api.pokemontcg.io/v1/cards")!
            
            self.fetch(url, defaultValue: [Pokemon]()) {
                self.pokemon = $0
            }
        }
    }
    
    func fetch<T: Decodable>(_ url: URL, defaultValue: T, completion: @escaping (T) -> Void) {
        
        let decoder = JSONDecoder()
        
        URLSession.shared.dataTaskPublisher(for: url)
            .retry(1)
            .map(\.data)
            .decode(type: T.self, decoder: decoder)
            .replaceError(with: defaultValue)
            .receive(on: DispatchQueue.main)
            .sink(receiveValue: completion)
            .store(in: &requests)
    }
}

【问题讨论】:

    标签: json swift api parsing networking


    【解决方案1】:

    键“cards”是一个对象数组,所以你需要将Pokemon更新为如下

    struct Pokemon: Codable {
        var cards : [Card]
    }
    

    由于 JSON 的根是字典而不是数组,请将 .onAppear 函数更新为

     .onAppear {
            let url = URL(string: "https://api.pokemontcg.io/v1/cards")!
            
            self.fetch(url, defaultValue: Pokemon(cards: [Card(id: "default", name: "default")])) {
                self.pokemon = $0
            }
        }
    

    【讨论】:

    • 感谢您的回复。不知道我是怎么错过的,但你去了。仍在学习,但感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多