У меня есть SwiftUI представление листа с ObservedObject , которое обрабатывает tcp-связь, когда этот лист отклоняется, мне нужно отправить последнее tcp-сообщение и затем закрыть сокет. Событие onDisappear , похоже, никогда не срабатывает ( Редактировать: виновник обнаружен, потому что я представляю лист с использованием UIHostingController , все еще нужно решение ) Я попытался поместить его в форму, представление навигации, попытался создать новый стек для него, ничего не получалось. Итак, я попытался использовать мой ObservedObject deinit, но это дает мне ошибку доступа, если я пытаюсь быстро открыть представление после его закрытия.
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 строки - это единственное, что даже срабатывает для меня, но срабатывает при создании листа и каждый раз, когда я прокручиваю строку из поля зрения, но не когда я отклоняю лист.