Я разрабатываю приложение, которое подключается к серверу через TCP (с использованием сетевой инфраструктуры), отправляет команды и получает XML данные. Сначала я использовал структуры и переменные, а в функциях didStartElement
, foundCharacters
и didEndElement
я добавил новые элементы в массивы и установил значения. Я выяснил, что это очень медленно. После этого я попробовал SwiftyXMLParser
, и хотя он использует XMLParser от Apple, он работает очень быстро.
Проблема в том, что я не могу наблюдать и изменять представление SwiftUI.
struct ConnectView: View {
@ObservedObject var connector = Connector.shared
@State var login = ""
@State var password = ""
var body: some View {
ZStack {
if connector.serverStatus.connected { //<---ok
// if connector.xml?.server_status["connected"].bool ?? false { // <---not ok
MainView().transition(.opacity)
} else {
TextField("Login", text: $login)
SecureField("Password", text: $password)
Button(action: connect) { Text("Connect") }
}
}
}
}
class Connector: ObservableObject {
private init() {}
static let shared = Connector()
@Published var xml: XML.Accessor!
@Published var serverStatus: ServerStatus = ServerStatus()
private static var connection: NWConnection?
private static func receive() {
connection?.receive(minimumIncompleteLength: 1, maximumLength: 65535) { (data, _, _, error) in
//…
shared.serverStatus.connected = Bool(shared.xml["server_status"].attributes["connected"] ?? "false") ?? false
//…
}
}
}
struct ServerStatus {
var id: Int?
var connected: Bool = false
var recover: Bool?
var serverTimeZone: String?
var systemVersion: Int?
var build: Int?
var status: String?
}