Я был бы более склонен к реализации RxBroadcaster следующим образом:
final class RxBroadcaster {
let response: Observable<UDPBroadcastResponse>
init(port: UInt16) {
let _response = PublishSubject<UDPBroadcastResponse>()
let _connection = UDPBroadcastConnection(port: port, handler: { ipAddress, port, response in
_response.onNext(UDPBroadcastResponse(ip: ipAddress, port: port, message: response))
})
response = _response.asObservable()
completion = _response.asObserver()
connection = _connection
}
deinit {
connection.closeConnection()
completion.onCompleted()
}
private let connection: UDPBroadcastConnection
private let completion: AnyObserver<UDPBroadcastResponse>
}
extension RxBroadcaster: ObserverType {
public func on(_ event: RxSwift.Event<Data>) {
guard case let .next(data) = event else { return }
connection.sendBroadcast(data)
}
}
Теперь вы можете отправлять данные, просто связываясь с RxBroadcaster myData.bind(to: myBroadcaster)
и получать данные, подписавшись на ответ вещателя.Соединение естественно закроется, когда Broadcaster выйдет из области видимости.
Мне немного странно делать оператор вызова / ответа, как вы.Смысл UDP-сокета в том, что вы будете получать сообщения независимо от отправленных вами.