【发布时间】:2020-04-12 12:20:17
【问题描述】:
似乎View.onReceive 在该视图消失后并没有取消订阅。当屏幕上没有子视图时,动作会不断被调用。
当视图仅可见时,如何使订阅保持活动状态?
struct BugDemo: View {
var body: some View {
NavigationView {
NavigationLink("Go to child", destination: Child())
}
}
}
struct Child: View {
@State private var date: Date = Date()
var body: some View {
Text(DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .medium))
.navigationBarTitle("Child")
.onReceive(PublisherHolder.shared.publisher) {
print("Child.onReceive")
self.date = $0
}
.onDisappear {
print("Child.onDisappear")
}
}
}
private class PublisherHolder {
static let shared = PublisherHolder()
lazy var publisher: AnyPublisher<Date, Never> = {
Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.print()
.eraseToAnyPublisher()
}()
}
【问题讨论】: