快速组合中未调用 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<AnyCancellable>()
更改为private var cancellable = Set<AnyCancellable>()
,效果很好。
【讨论】:
【参考方案2】:更新
在 swiftUI1 中,UIHostingcontroller 中的 viewDidLoad 没有被调用。
在使用 combine 时,通过 UIKit,在 viewDidload 中订阅(Sink),不起作用,而是在 viewDidAppear 中订阅
【讨论】:
以上是关于快速组合中未调用 sink()的主要内容,如果未能解决你的问题,请参考以下文章
调用 StreamController.sink.add 时 StreamBuilder 没有反应