繁体   English   中英

sink() 在 combine swift 中不被调用

[英]sink() is not called in combine swift

我有一个运行良好的 LocationManager 类。 这是 LocationManager 类的一部分。

  var headingDegree = PassthroughSubject<Double, Never>()

  func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
    headingDegree.send(-newHeading.magneticHeading)
  }

headingDegree是我想发送到我的 ViewModel 的值。 我调试了它以确保它具有正确的值,并且确实如此。

所以,在我的视图模型中,

class CompassViewViewModel: ObservableObject {
 @Published var degree: Double = 0.0
 @State var cancellable = Set<AnyCancellable>()

 func update() {
    LocationManager.shared.headingDegree.sink {
      self.degree = $0
    }
    .store(in: &cancellable)
  }

headingDegree 这是给我带来问题的部分。 如果我在update()函数中放置断点,则永远不会调用self.degree = $0

这就是我的视图的样子。

struct CompassView: View {
  @ObservedObject var viewModel: CompassViewViewModel

  init(viewModel: CompassViewViewModel) {
    self.viewModel = viewModel
  }

 var body: some View {
    ZStack {
      Text("aa")
        .font(.footnote)
    }
      .onAppear {
        self.viewModel.update()
    }
  }
}

你能告诉我为什么我的 sink() 没有被调用吗?

我将@State var cancellable = Set<AnyCancellable>()更改为private var cancellable = Set<AnyCancellable>()并且效果很好。

更新

在 swiftUI1 中,不会调用 UIHostingcontroller 中的 viewDidLoad。


当使用结合使用 UIKit 时,在 viewDidload 中订阅 (Sink) 不起作用,而是在 viewDidAppear 中订阅

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM