Kode berikut dulu berfungsi hingga beberapa hari yang lalu. Saya tidak tahu apa yang diperbarui, mungkin baru 14.4? Tapi tiba-tiba berhenti bekerja hari ini dengan kesalahan yang tidak mencolok dan saya tidak tahu apa yang salah di sini.

FetchStockAPIApp.swift

import SwiftUI

@main
struct FetchStockAPIApp: App {
    @StateObject public var stocks = TFViewModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView(stocks: stocks)
        }
    }
}

ContentView.swift

import SwiftUI

struct ContentView: View {
    @ObservedObject var stocks : TFViewModel
    
    let isSSL = false
    public var url : String = "http://10.0.0.41:8111/xyz123"
    public var sslurl: String = "https://domain.name:8100/xyz123"
    
    var body: some View {
        ScrollView {
            ForEach(stocks.tfstocks!, id: \.recid) { item in
                Text("123")
            }
        }
        .onAppear {stocks.fetchData(apiUrl: isSSL ? sslurl : url)}
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(stocks: TFViewModel())
    }
}

TFDataModel.swift

import SwiftUI

struct TFStock: Codable, Hashable {
    var recid = UUID()
    var symbol: String
    var Close: Double
}


class TFViewModel: ObservableObject {
    @Published var tfstocks: [TFStock]? = [TFStock]()
    
    func fetchData(apiUrl: String) {
        
        guard let url = URL(string: apiUrl) else {
            print("URL is not valid")
            return
        }
        
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) {
            data, response, error in
            if let data = data {  // data is Optional, so
                // you need to unwrap it
                if let decodedResult = try?
                    JSONDecoder().decode(
                        [TFStock].self, from: data) {
                    // decoding is successful
                    DispatchQueue.main.async {
                        // assign the decoded articles to
                        // the state variable
                        self.tfstocks = decodedResult
                    }
                    //print(decodedResult)
                    return
                }
            }
            print("Error: \(error?.localizedDescription ?? "Unknown error in API Fetch")")
        }.resume()
    }
}

Hapus XXX dari url SSL untuk membuat panggilan API itu berfungsi dalam kode. Saya akan sangat berterima kasih jika seseorang dapat membantu saya di sini.

Anda perlu mengubah isSSL = true menjadi AKTIF sehingga Anda menggunakan nama domain, karena IP lainnya hanyalah API yang sama di jaringan lokal saya.

0
AndiAna 11 Mei 2021, 20:34

1 menjawab

Jawaban Terbaik

Saya menyarankan Anda untuk membaca lebih lanjut tentang protokol Codable dan kegunaannya. Anda dapat merujuk tautan di bawah ini.

https://medium.com/@pleelaprasad/codable-protocols-in- swift-76f8b088c483.

Blok tangkap mencetak kesalahan di bawah ini untuk kode Anda.

keyNotFound(CodingKeys(stringValue: "recid", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "Tidak ada nilai yang terkait dengan kunci CodingKeys(stringValue : "recid", intValue: nil) ("recid").", underlyingError: nil)) Kesalahan: Kesalahan tidak diketahui dalam Pengambilan API

Saya telah memverifikasi hal yang sama menggunakan tukang pos.

Di bawah ini adalah solusi kerja.

import SwiftUI

struct ContentViewsss: View {
    @ObservedObject var stocks : TFViewModel
    
    let isSSL = true
    public var url : String = "http://10.0.0.41:8111/xyz123"
    public var sslurl: String = "https://domain.name/xyz123"
    
    var body: some View {
        ScrollView {
            ForEach(stocks.tfstocks!, id: \.recid) { item in
                Text(item.symbol)
            }
        }
        .onAppear {stocks.fetchData(apiUrl: isSSL ? sslurl : url)}
    }
}

struct TFStock: Codable, Hashable {
    var recid = UUID()
    var symbol: String
    var Close: Double
    
    private enum CodingKeys : String, CodingKey {
        case  symbol, Close
    }
}


class TFViewModel: ObservableObject {
    @Published var tfstocks: [TFStock]? = [TFStock]()
    
    func fetchData(apiUrl: String) {
        
        guard let url = URL(string: apiUrl) else {
            print("URL is not valid")
            return
        }
        
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) {
            data, response, error in
            if let data = data {  // data is Optional, so
                // you need to unwrap it
                
                do{
                    let decodedResult = try
                        JSONDecoder().decode(
                            [TFStock].self, from: data)
                    // decoding is successful
                    DispatchQueue.main.async {
                        // assign the decoded articles to
                        // the state variable
                        self.tfstocks = decodedResult
                    }
                    //print(decodedResult)
                    return
                    
                }catch let error{
                    print(error)
                }
                
            }
            print("Error: \(error?.localizedDescription ?? "Unknown error in API Fetch")")
        }.resume()
    }
}
1
AndiAna 12 Mei 2021, 19:52