ios - SwiftUI 使用套接字有效负载更新列表
问题描述
我是 SwiftUI 的新手,不知道应该如何构建我的应用程序。
我正在构建一个股票应用程序,它将显示股票列表,我想使用 SocketIO 连接到我的后端,以实时更新股票列表。
这是我到目前为止所拥有的:
import Combine
import SocketIO
import SwiftUI
struct RealtimePriceResponse: Codable {
let quotes: [RealtimeQuote]
}
struct RealtimeQuote: Codable {
let ticker, last, previousClose: String?
}
class SocketConnection: ObservableObject {
@Published var realtimeQuotes: [RealtimeQuote] = []
@Published var isConnected: Bool = false
let socketManager = SocketManager(socketURL: URL(string: "https://api.myapp.com")!, config: [.log(true), .compress])
var socket: SocketIO.SocketIOClient
init(tickers: [String]) {
socket = socketManager.defaultSocket
socket.connect()
socket.on(clientEvent: .connect) { data, ack in
self.isConnected = true
print("Socket has connected")
self.socket.emit("priceListen", ["userId": "121212", "symbols": tickers])
}
socket.on("userid") { [unowned self] data, ack in
let decoder = JSONDecoder()
let jsonData = try? JSONSerialization.data(withJSONObject: data[0])
let priceUpdates = try? decoder.decode(RealtimePriceResponse.self, from: jsonData!)
if let decoded = priceUpdates {
self.realtimeQuotes = decoded.quotes
print("Real-time Prices: \(String(describing: decoded))")
}
}
socket.on(clientEvent: .disconnect) { data, ack in
self.isConnected = false
print("Socket has disconnected")
}
}
}
struct StocksView: View {
var tickers: [String] = ["TSLA", "SNAP", "DIS", "AMZN"]
@ObservedObject var socket: SocketConnection
init() {
self.socket = SocketConnection(tickers: self.tickers)
}
var body: some View {
return List(tickers, id: \.self) { ticker in
Stock(ticker: ticker, quote: self.socket.realtimeQuotes.first(where: { $0.ticker == ticker }) ?? RealtimeQuote?.none)
}
}
}
struct Stock: View {
var ticker: String
var price: String
init(ticker: String, quote: RealtimeQuote?) {
self.ticker = ticker
if let quote = quote {
price = quote.last!
} else {
self.price = "--.--"
}
}
var body: some View {
HStack {
Text(ticker).bold()
Spacer()
Text("$\(price)")
}
}
}
这不像我期望的那样工作。我的观点应该保留这个 SocketConnection 类的实例吗?这似乎有风险,而且不是最好的方法。另外,我应该如何只更新 HStack 中保存价格的 Text() 视图?
解决方案
使SocketConnection
andObservableObject
它是实例 and ObservedObject
。
class SocketConnection: ObservableObject {
//...
}
//...
struct StocksView: View {
//...
@ObservedObject var homeSocket: SocketConnection
//...
}
推荐阅读
- reactjs - 尝试导入错误:“OBJLoader”未从“三”导出(导入为“三”)
- apache-nifi - 一个处理器中的多个依赖创建语句
- npm-install - Npm install 动作超级慢:finalize
- java - XSLT:如何在同一行中制作 2 个零件?
- amazon-dynamodb - 如何在 dynamodb 查询中按时间戳排序
- python - 如何在 sphinx 中渲染 readme.md,其中包含一些图像的相对路径
- google-play - Play 管理中心无法点击创建新发布按钮
- c++ - 在不进行内存复制的情况下,在 C++ 中获取一定范围的内存
- ios - 快速调整日期选择器和 TextView 的大小有什么问题
- regex - 在多行中提取两个字符串之间的数字