快速组合中未调用 sink()

Posted

技术标签:

【中文标题】快速组合中未调用 sink()【英文标题】:sink() is not called in combine swift 【发布时间】:2020-01-13 08:25:38 【问题描述】:

我的 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() 没有被调用吗?

【问题讨论】:

【参考方案1】:

我将@State var cancellable = Set&lt;AnyCancellable&gt;() 更改为private var cancellable = Set&lt;AnyCancellable&gt;(),效果很好。

【讨论】:

【参考方案2】:

更新

在 swiftUI1 中,UIHostingcontroller 中的 viewDidLoad 没有被调用。


在使用 combine 时,通过 UIKit,在 viewDidload 中订阅(Sink),不起作用,而是在 viewDidAppear 中订阅

【讨论】:

以上是关于快速组合中未调用 sink()的主要内容,如果未能解决你的问题,请参考以下文章

Sink

调用 StreamController.sink.add 时 StreamBuilder 没有反应

如何在 BLoC 模式中调用 sink.fromFuture?

调用的 API 响应中未定义的调用函数

在 useEffect() 中未调用函数

UICollectionReusableView 中未调用委托