如何重用 socket.io emit 函数?尝试将套接字发射功能附加到 SwiftUI 按钮(操作)?
How can I reuse the socket.io emit function? Trying to attach the socket emit function to the SwiftUI button (action)?
我是 SwitftUI 的新手,Xcode。
我正在尝试重新使用 class -> init() 部分中的 send/emit 函数。
但是,当我尝试将函数调用到按钮(操作)中时,Xcode 会显示 'cannot find scope'。我意识到问题是因为我的函数在 'init()' 中。但是,我尝试并未能从 'init()'.
中提取行代码
'init()'、'let socket = manager.defaultSocket' 正下方的代码行无法从 init() 中拉出。当我将这段代码拉出到 class 部分时,我得到了 'socket' 之类的错误或没有 'emit' 这样的工作。
我被这个问题困了好几天了。
我试图将发射代码分组到一个函数中,将其放在一个按钮函数上,但Xcode不认识它,这是我的 sendmsg 函数,如果我带上,我会遇到很多编译错误这个函数来自 'init()'
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()
}
}
}
----------
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))
}
}
}
}
}
我是 SwitftUI 的新手,Xcode。 我正在尝试重新使用 class -> init() 部分中的 send/emit 函数。 但是,当我尝试将函数调用到按钮(操作)中时,Xcode 会显示 'cannot find scope'。我意识到问题是因为我的函数在 'init()' 中。但是,我尝试并未能从 'init()'.
中提取行代码'init()'、'let socket = manager.defaultSocket' 正下方的代码行无法从 init() 中拉出。当我将这段代码拉出到 class 部分时,我得到了 'socket' 之类的错误或没有 'emit' 这样的工作。 我被这个问题困了好几天了。
我试图将发射代码分组到一个函数中,将其放在一个按钮函数上,但Xcode不认识它,这是我的 sendmsg 函数,如果我带上,我会遇到很多编译错误这个函数来自 'init()'
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()
}
}
}
----------
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))
}
}
}
}
}