C.Jones
C.Jones

Reputation: 161

Updating swiftui text view after parsing json data

I have a function that goes out to an api and gets a stock price. I have the function returning a double and I can see the correct price print out to the console when I run the code. When I try to set that price to a variable inside the function so the function can return it, I just get 0.000 in the text view. Can someone tell me what I'm doing wrong? My code is below.

import SwiftUI

struct ListView: View {

    var body: some View {


        List {


            HStack {
                Text("Stock Price (15 Min. delay)")
                Spacer()
                Text("\(getStockPrice(stock: symbol))")
            }



        }
    }

    func getStockPrice(stock: String) -> Double {

           var thePrice = Double()

           guard let url = URL(string: "my url to get data") else {

               fatalError("URL does not work!")

           }
           URLSession.shared.dataTask(with: url) { jsonData, _, _ in

               guard let jData = jsonData else {return}

               do {
                   if let json = try JSONSerialization.jsonObject(with: jData, options: []) as? [String: Any] {

                        if let pricer = json["latestPrice"] as? Double {

                                print(pricer)

                                thePrice = pricer


                        }



                   }
               } catch let err {
                   print(err.localizedDescription)
               }



           }.resume()
        return thePrice
       }

}

Upvotes: 1

Views: 1160

Answers (1)

Hrabovskyi Oleksandr
Hrabovskyi Oleksandr

Reputation: 3275

You can update your UI with changing the @State variable, like in code below:

struct UpdatingPriceAsync: View {

    @State var stockPrice: Double = 0.0

    var body: some View {


        List {

            HStack {
                Text("Stock Price (15 Min. delay)")
                Spacer()
                Text("\(stockPrice)")
                    .onAppear() {
                        self.updateStockPrice(stock: "something")
                }
            }

        }

    }

    private func updateStockPrice(stock: String) {

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // sort of URL session task
            DispatchQueue.main.async { // you need to update it in main thread!
                self.stockPrice = 99.9
            }
        }

    }

}

Upvotes: 3

Related Questions