【问题标题】:Add ticker to a new row using SwiftUI and WebSockets使用 SwiftUI 和 WebSockets 将代码添加到新行
【发布时间】:2020-08-04 14:54:25
【问题描述】:

我正在尝试在使用 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

【问题讨论】:

    标签: swift websocket swiftui swiftui-navigationlink


    【解决方案1】:

    仔细检查 ˋidˋ (Stock.s) 是否真的对所有行都是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多