Добавить тикер в новую строку с помощью SwiftUI и WebSockets - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь добавить новую строку после подписки на тикер с помощью WebSockets, но данные отображаются в той же строке, поэтому один тикер перекрывает другой.

Эти фиктивные данные работают. Он показывает две строки с данными. @Published var tickerPrice = [StockMarketModel.Stock(p: 10, s: "Test", t: 11, v: 122), StockMarketModel.Stock(p: 12, s: "TestData", t: 02, v: 122)], it shows in 2 rows. That's where I pass the data from WebSocket:

Однако, когда я получаю данные с сервера Finnhub, данные отображаются в одной строке, поэтому один тикер перекрывает другой.

Есть идеи?

Заранее спасибо.

   func connect() {
          
          stop()
          webSocketTask = urlSession.webSocketTask(with: baseURL)
          webSocketTask?.resume()
          
        sendMessage(with: "")
          receiveMessage()
          //sendPing()
      }

 @Published var tickerPrice = [StockMarketModel.LastPrice]()
 private func receiveMessage() {
        webSocketTask?.receive {[weak self] result in
            
            switch result {
            case .failure(let error):
                print("Error in receiving message: \(error)")
            case .success(.string(let str)):
                
                do {
                    let decoder = JSONDecoder()
                    let result = try decoder.decode(StockMarketModel.APIData.self, from: Data(str.utf8))
                    DispatchQueue.main.async{

                        self?.tickerPrice = result.data

                        
                        print(result.data[0].p)

                    }
                } catch  {
                    print("error is \(error)")
                }
                
                self?.receiveMessage()
                
            default:
                print("default")
            }
        }
    }

Это основной вид:

    
    @ObservedObject var services: WebSocketConnect

    @State var chosenCurrencies: [String]
    
    @State var currencies: [String] = ["AAPL", "AMZN", "BINANCE:BTCUSDT","IC MARKETS:1", "BINANCE:ETHUSDT","BINANCE:LTCBTC","BINANCE:BNBBTC"]
    
    @State var results = [CompanyDetailsModel]()
    
    var companyDetails: CompanyDetailsModel
    
    var body: some View {
        NavigationView {
            
            List(services.tickerPrice) { share in
                
                NavigationLink(destination: DetailView(services: WebSocketConnect(), urlSession: URLSessionConnect(latestData: self.companyDetails), chosenPair: self.$services.tickerPrice[0].s)) {
                    
    
                    HStack {
                        
                        Text(String(share.s))
                        Text(String(share.p))
                            
                            .font(.system(size: 24))
                        
                    }
                    
                }
            }
            .onAppear { self.chosenCurrencies = [UserDefaultsConfig.symbol[0].s]
                self.services.connect()
                print(UserDefaultsConfig.symbol, "Symbols")
            }
            .navigationBarItems(trailing: choosePairs)
            .onDisappear { self.services.stop() }
            .padding(16)
            .navigationBarTitle("BetVictor")
        }
   
    }
    
    @State private var showFilter = false
    
    var choosePairs: some View {
        Button("Choose Pairs") {
            self.showFilter = true
        }
        .popover(isPresented: $showFilter) {
            AddCurrencyView(viewModel: self.viewModel, currenciesToAdd: self.$chosenCurrencies, currencies: self.$currencies, removedCurrencies: [""], services: WebSocketConnect(), isPresented: self.$showFilter)
            
        }
    }
    
}

Это модель:


   struct APIData: Codable, Hashable {
           let data: [Stock]
           let type: String

           enum CodingKeys: String, CodingKey {
               case data = "data"
               case type = "type"
           }
       } 
  struct Stock: Codable, Hashable, Identifiable {
        
        var id: String {
            return s
        }
        var p: Double
        var s: String
        var t: Int
        var v: Double
        
        enum CodingKeys: String, CodingKey {
            case p = "p"
            case s = "s"
            case t = "t"
            case v = "v"
        }
    }

Это документация по API: https://finnhub.io/docs/api#introduction

1 Ответ

0 голосов
/ 07 августа 2020

Дважды проверьте, действительно ли ˋidˋ (Stock.s) уникален для всех строк.

...