У меня есть представление листа SwiftUI с ObservedObject, которое обрабатывает tcp-связь, когда этот лист закрывается, мне нужно, чтобы он отправил последнее tcp-сообщение, а затем закрыл сокет. Кажется, что событие onDisappear никогда не запускается (Edit: выяснилось, в чем причина, потому что я представляю лист с помощью UIHostingController, все еще нужно решение strong>) Я попытался поместить его в форму, представление навигации, попытался создать для него новый стек, ничего не сработало. Итак, я попытался использовать деиницирование ObservedObject, но это дает мне ошибку плохого доступа, если я пытаюсь быстро снова открыть представление после его закрытия.
deinit {
let msg = getUpdatedTimersString()
self.connection.sendMsg(msg, success: connection.close)
}
из моего класса подключения, который использует Network Framework
func sendMsg(_ message: String, success: @escaping () -> Void = { }, error: @escaping () -> Void = { }) {
let msg = message + "\r\n"
let data: Data? = msg.data(using: .utf8)
debugPrint("Sending: \(msg)")
connection.send(content: data, completion: .contentProcessed { (sendError) in
if let sendError = sendError {
self.debug("\(sendError)")
error()
} else {
success()
}
})
}
func close() {
connection.cancel()
}
Изменить: добавление кода просмотра ниже
struct ScheduleView: View {
@ObservedObject var scheduleManager = ScheduleManager() // This handles the tcp communication, the deinit you see above is from this
var body: some View {
NavigationView {
Form {
ForEach(scheduleManager.timers) { timer in
ScheduleForm(scheduleManager: self.scheduleManager, timer: timer).onDisappear { debugPrint("schedule form row disappeared") } // This is just a view that adds a section header and a DatePicker to the form for each timer
}
}.onDisappear { debugPrint("form disappeared") }
.navigationBarTitle(Text("Schedule"), displayMode: .inline)
}.onDisappear() { debugPrint("nav disappeared") }
}
}
Ни один из этих onDisappear не работает для меня, строка в строках ScheduleForm - единственная, которая даже срабатывает для меня, но она срабатывает при создании листа и каждый раз, когда я прокрутите строку с глаз долой, но не тогда, когда я закрываю лист.