0

我正在编写一个应用程序,它通过与设备的 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 连接接收数据之前返回。然而,接收函数中的打印语句确实打印了正确的数据,但它只是在函数接收已经返回之后才这样做。

4

0 回答 0