2

我有一个服务文件,它获取数据并将其发送到后端。是否可以将推送数据从服务推送到视图并让 UI 像 @State 一样获取更改(不像全局变量)。

@EnviornmentObject 不工作只读全局变量不工作,因为不通知 UI

import SwiftUI
import SocketIO
import Combine

let manager = SocketManager(socketURL: URL(string: "http://localhost:30000/ios")!, config: [.log(true), .compress])
let socket = manager.defaultSocket

class Socket: BindableObject {
    let didChange = PassthroughSubject<Socket,Never>()
    var sliderValue: Float = 6 {
        willSet {
            print(newValue)
            didChange.send(self)
        }
    }
    static let sharedInstance = Socket()
    init() {

        socket.on(clientEvent: .connect) {data, ack in
            print("socket connected")
            self.sliderValue = 8 
        }

    }


    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }
}

主页视图:

import SwiftUI

struct HomeView : View {
    @EnvironmentObject var socketData: Socket

    var body: some View {
        VStack {
            Text("Hello World")
            Slider(value: $socketData.sliderValue, from: 0.0, through: 10.0)
            Text(String(socketData.sliderValue))
        }
    }
}
4

2 回答 2

1

我仍然有无法从套接字获取数据但正常字符串正在工作的问题我将为这个问题打开一个新问题: 如何修复'无法将'[Any]'类型的值转换为'String'类型快速强制错误

我确实不得不使用 didSet 这里是代码:

let manager = SocketManager(socketURL: URL(string: "http://localhost:30000/ios")!, config: [.log(true), .compress])
let socket = manager.defaultSocket


class Socket: BindableObject {
    let didChange = PassthroughSubject<Socket,Never>()
    var days: String = "Loading..." {
        didSet {
            didChange.send(self)
        }
    }
    static let sharedInstance = Socket()
    init() {

        socket.on(clientEvent: .connect) {data, ack in
            print("socket connected")
        }
        socket.on("dailyWeather") {data, ack in
            print("just a test")
            self.days = "cur"
        }
    }


    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }
}
于 2019-07-19T13:51:01.920 回答
0

您可以使您的 Socket 具有 amessagePublisher以便使用传入消息更新子视图。

class Socket {
    static let sharedInstance = Socket()
    public let messagePublisher = PassthroughSubject<Message, Never>()
    init() {

      socket.on(clientEvent: .connect) {data, ack in
          print("socket connected")
          let message = data as! Message
          messagePublisher.send(message)
      }

    }
}

然后让您的孩子像这样订阅传入的消息:

Socket.sharedInstance.assign(to: \.message, on: messageModel)

whereMessageModel符合BindableObject协议

于 2019-07-18T18:49:09.690 回答