0

下面的工作等待时间为 2 秒,但将其设置为 0.5 并且您无法通过第二个屏幕。

import SwiftUI

let waitTime: TimeInterval = 0.5


class ContentViewModel: ObservableObject {
  @Published var shouldNavigate = false
  init() {
    DispatchQueue.main.asyncAfter(deadline: .now() + waitTime) { [weak self] in
      self?.shouldNavigate = true
    }
  }
}

struct ContentView: View {
  @ObservedObject var viewModel = ContentViewModel()

  var body: some View {
    NavigationView {
      VStack{
        Text("Hello, world!")
          .padding()
        NavigationLink(
          destination: ContentView2(),
          isActive: $viewModel.shouldNavigate,
          label: {
            EmptyView()
          }).isDetailLink(false)
      }
    }
  }
}

struct ContentView2: View {
  @ObservedObject var viewModel = ContentViewModel()

  var body: some View {
    VStack {
      Text("View 2")
        .padding()
      NavigationLink(
        destination: ContentView2(),
        isActive: $viewModel.shouldNavigate,
        label: {
          EmptyView()
        }).isDetailLink(false)
    }
  }
}

当我订阅shouldNavigate并打印传入的值时,我可以看到较短的等待时间会导致它nil在导航后快速进入,而较长的等待时间不会产生这种效果。

是否发生了一些我不知道的生命周期事件?

IRL,我在视图模型搜索广告 BLE 外围设备时显示一个屏幕,并在发现它时进行导航。这种搜索可能非常快。我宁愿不实施一些临时延迟,因为它很臭(感觉就像我在对用户撒谎)。

4

0 回答 0