2

我有一个相当大的项目,我从故事板和 xibs 开始。现在我正在使用 swiftui 实现一些新视图。这是我用来执行此操作的代码:

func goToSchedule() {
    let scheduleController = ScheduleController()
    let vc = UIHostingController(rootView: ScheduleView().environmentObject(scheduleController))
    if let topController = UIApplication.topViewController() {
        topController.present(vc, animated: true, completion: nil)
    }
}

但是当我关闭(向下滑动)视图并再次打开它时出现问题,每次我这样做都会创建一个环境对象的额外副本,这个对象是一个处理 tcp 连接的类,缩短的代码如下:

class ScheduleController: ObservableObject, NetworkDelegate {
    var didChange = PassthroughSubject<Void, Never>()
    @Published var timers = [ScheduleTimer]()
    let connection = tcpNetwork()
    init() {
        connection.delegate = self
    }
    func send(data: String) {
        self.connection.sendMsg(data)
    }
    func processData(data: String) {
    // long function where the received data is parsed and the timers array is updated
}}

观点是这样的:

struct ScheduleView: View {
@EnvironmentObject var scheduleController: ScheduleController

var body: some View {
    NavigationView {
      List {
        ForEach(scheduleController.timers, id: \.self) { timer in
            TimerRow(id: timer.id, name: timer.name, startTimer: timer.start, endTimer: timer.end, isActive: timer.isActive)
        }
      }}
4

1 回答 1

0

刚刚通过将 EnvironmentObject 替换为 ObservedObject 并将其添加到 ScheduleController 的 deinit 方法来解决此问题

deinit() {
    connection.cancel()
}
于 2020-01-05T04:30:31.933 回答