Проблема при попытке работать с NWConnection в Network.Framework

Я пишу приложение, которое отправляет команды и получает данные через сетевое соединение 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")
            }
        }
    }
}

Итак, если я создам экземпляр этого объекта и выполню операторы makeConnection(), send(myCommand: aCommand), receive() из ViewController, все будет работать, но функции запускаются и возвращаются до фактической отправки команд и возврата значений.

Другими словами, я не могу вернуть значение backToString в качестве возвращаемого значения из функции receive(). Если я это сделаю, он всегда будет возвращать «тест», который является начальным значением. В конечном итоге оно будет заменено строковым значением, возвращенным устройством, но только после задержки и только после того, как функция уже возвратилась.

Что я хочу сделать, это сделать функцию получения формы receive() -> Stringгде String — текстовая строка, возвращаемая устройством, которому была отправлена ​​команда. Но я предполагаю, что это невозможно, потому что функция приема возвращается до того, как backToString действительно получает какие-либо данные. Я немного смущен этим. Кажется, что функция должна оставаться остановленной до тех пор, пока не будет получено значение, но она не просто возвращается до того, как переменная backToString получит данные из UDP-соединения. Однако оператор печати в функции приема печатает правильные данные, но только после того, как функция приема уже вернула значение.

0 ответов

Другие вопросы по тегам