如何重用 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