如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?

Posted

技术标签:

【中文标题】如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?【英文标题】:How can I reuse the socket.io emit function? Trying to attach the socket emit function to the SwiftUI button (action)? 【发布时间】:2021-12-28 10:16:12 【问题描述】:

我是 SwitftUI 和 Xcode 的新手。 我正在尝试重新使用 class -> init() 部分中的 send/emit 函数。 但是,当我尝试将函数调用到按钮(操作)中时,Xcode 会说“找不到范围”。我意识到问题是因为我的函数在'init()'中。但是,我尝试将行代码从“init()”中提取出来,但失败了。

'init()' 正下方的代码行,'let socket = manager.defaultSocket' 不能从 init() 中拉出。当我将这段代码拉到类部分时,我会得到像“socket”这样的错误,或者没有像“emit”这样的工作。 我被这个问题困扰了很多天。

我尝试将发出代码分组到一个 func 中以将其放在按钮 func 上,但 Xcode 无法识别它,这是我的 sendmsg func,如果我将这个 func 带出 ' 会出现很多编译错误初始化()'

func sendMsg()
    socket.on(clientEvent: .connect) (data, ack) in
        print("Connected")
        DispatchQueue.main.async
            socket.emit("NodeJS Server Port","Hi server111")
            socket.emit("NodeJS Server Port","testing")
            sleep(UInt32(0.3))
    

This is the error I got when I put it into the button action

以下是我的完整且有效的代码,但尚未完成。我的代码能够连接,接收味精,但连接后只能发送一次味精。我正在尝试从我的 SwiftUI 按钮连续向节点 js 发送消息。

import SwiftUI
import SocketIO
import zlib


final class Service: ObservableObject 

    @Published var manager = SocketManager(socketURL: URL(string:"ws://localhost:4044")!, config:[.log(true), .compress])
    @Published var messages = [String]()
    
   func sendMsgFunc()
   

    
    init()
        let socket = manager.defaultSocket

        _sendMsg()
        func _sendMsg()
            socket.on(clientEvent: .connect) (data, ack) in 
                print("Connected")
                DispatchQueue.main.async
                    socket.emit("NodeJS Server Port","Hi server111") 
                    socket.emit("NodeJS Server Port","testing") 
                    sleep(UInt32(0.3))
            
        
        socket.on("ios Client Port") [weak self] (data, ack) in //receive
            if let data = data[0] as? [String: String],
               let rawMessage = data["msg"]   
                DispatchQueue.main.async
                    self?.messages.append(rawMessage)
                    print(rawMessage)
                    socket.emit("NodeJS Server Port","msg received")
                    sleep(UInt32(0.3))
                    
                
            
            
        
        socket.connect()
        
    
    


struct ContentView: View 
    
    
    @ObservedObject var service = Service()
    @State var test: String = ""
    @State var textFieldText: String = ""
    @State var dataArray: [String] = []

    var body: some View  
        
        VStack
            Text("Received messages")
                .font(.largeTitle)
            
            Button("Click", action: service.sendMsgFunc)
            Button("Connect .2")
                print("hello .2")
            

            ForEach(service.messages, id: \.self)  msg in
                Text(msg).padding() // Receive from Js
            
            
        

    
    struct ContentView_Previews: PreviewProvider 
        static var previews: some View 
            ContentView()
        
    
    



----------

【问题讨论】:

【参考方案1】:

let socket = ... 可以在任何需要的地方重复。因此,如果您在init 中需要它,您可以将它包含在其中。如果您在sendMsg() 中需要它,您也可以在其中包含它。

因为您的代码中有一些不匹配的大括号,所以要准确说出您希望所有事情发生的位置是一个挑战,但这似乎符合您的需求:

final class Service: ObservableObject 
    
    @Published var manager = SocketManager(socketURL: URL(string:"ws://localhost:4044")!, config:[.log(true), .compress])
    @Published var messages = [String]()
    
    init()
        let socket = manager.defaultSocket
        sendMsg()
        socket.connect()
    
    
    func sendMsg()
        let socket = manager.defaultSocket
        
        socket.on(clientEvent: .connect) (data, ack) in
            print("Connected")
            DispatchQueue.main.async
                socket.emit("NodeJS Server Port","Hi server111")
                socket.emit("NodeJS Server Port","testing")
                sleep(UInt32(0.3))
            
        
        socket.on("iOS Client Port") [weak self] (data, ack) in //receive
            if let data = data[0] as? [String: String],
               let rawMessage = data["msg"] 
                DispatchQueue.main.async
                    self?.messages.append(rawMessage)
                    print(rawMessage)
                    socket.emit("NodeJS Server Port","msg received")
                    sleep(UInt32(0.3))
                
            
        
    

【讨论】:

您好,先生,这是我需要的!非常感谢您的宝贵时间!

以上是关于如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?的主要内容,如果未能解决你的问题,请参考以下文章

在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

在重新连接、socket.io、node.js 时重用套接字 id

覆盖socket.io的发射和开启?

世博会套接字发射不工作,但正在工作

在 NestJs 中使用 Socket IO 加入和发射到房间

socket.io和express服务器没有从客户端接收发射