我正在编写一个应用程序,它通过与设备的 UDP 网络连接发送命令和接收数据。
我正在尝试创建一个处理所有网络相关任务的对象。
我希望对象建立连接,向连接发送命令字符串,并从连接接收数据。我可以让所有部分正常工作,但它们与正在运行的程序不同步。很难解释,但让我先向您展示代码,然后再解释问题。
import Foundation
import Network
var myConnection: NWConnection?
var backToString = "test"
class NetworkUDP: NSObject{
func makeConnection(){
let myPort = NWEndpoint.Port(rawValue: 50536)
let myHost = NWEndpoint.Host("192.168.7.239")
myConnection = NWConnection(host: myHost, port: myPort!, using: .udp)
myConnection?.start(queue: .main)
}
func send(myCommand: String) {
myConnection?.send(content: myCommand.data(using: String.Encoding.utf8), completion: NWConnection.SendCompletion.contentProcessed({(NWError) in print(NWError as Any)}))
print(myCommand)
}
func receive() {
myConnection?.receiveMessage { (data, context, isComplete, error) in
if (data != nil) {
backToString = String(decoding: data!, as : UTF8.self)
print(backToString)
} else {
print("Data = nil")
}
}
}
}
因此,如果我实例化此对象并从 ViewController 发出 makeConnection()、send(myCommand: aCommand)、receive() 语句,一切正常,但函数在实际发送命令和返回值之前运行并返回。
换句话说,我不能将 backToString 的值作为函数 receive() 的返回值返回。如果我这样做,它将始终返回“test”,这是初始值。它最终将被设备返回的字符串值替换,但仅在延迟之后且仅在函数已经返回之后。
我想做的是制作一个接收函数,receive() -> String
其中 String 是从发送命令的设备返回的文本字符串。但我想这是不可能的,因为接收函数在 backToString 实际接收任何数据之前返回。我对此有点困惑。似乎该函数应该保持暂停,直到收到一个值,但它不会在 backToString 变量从 UDP 连接接收数据之前返回。然而,接收函数中的打印语句确实打印了正确的数据,但它只是在函数接收已经返回之后才这样做。