Я пытаюсь добавить новую строку после подписки на тикер с помощью 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