组合中未调用 sink() swift
sink() is not called in combine swift
我的 LocationManager class 运行良好。这是 LocationManager class 的一部分。
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 = [=12=]
}
.store(in: &cancellable)
}
我沉没了我的 headingDegree
。这是给我带来问题的部分。如果我在 update()
函数中放置断点,则永远不会调用 self.degree = [=17=]
。
这是我的视图的样子。
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 没有被调用。
当使用 combine 和 UIKit 时,在 viewDidload 中订阅 (Sink) 无效,改为在 viewDidAppear 中订阅
我的 LocationManager class 运行良好。这是 LocationManager class 的一部分。
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 = [=12=]
}
.store(in: &cancellable)
}
我沉没了我的 headingDegree
。这是给我带来问题的部分。如果我在 update()
函数中放置断点,则永远不会调用 self.degree = [=17=]
。
这是我的视图的样子。
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 没有被调用。
当使用 combine 和 UIKit 时,在 viewDidload 中订阅 (Sink) 无效,改为在 viewDidAppear 中订阅