首页 > 解决方案 > onReceive 在某些情况下未触发

问题描述

以下是我的工作代码:

struct ReaderView: View {
    @State var presentingSettingsSheet = false
    @State var currentDate = Date()

private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
    .autoconnect()
    .eraseToAnyPublisher()

var body: some View {
    let filter = "Showing all stories"

    return NavigationView {
        List {
            Section(header: Text(filter).padding(.leading, -10)) {
                VStack(alignment: .leading, spacing: 10) {
                    TimeBadge(time: 20.0)

                    Text("Title")
                        .frame(minHeight: 0, maxHeight: 100)
                        .font(.title)

                    PostedBy(time: 30.0, user: "Author", currentDate: self.currentDate)
                    }
                .padding()
            }
        }
        .sheet(isPresented: self.$presentingSettingsSheet, content: {
            SettingsView()
        })
        .navigationBarTitle(Text("Stories"))
        .navigationBarItems(trailing:
            Button("Settings") {
                self.presentingSettingsSheet = true

            }
        )
    }
    .onReceive(timer) {
        print($0)
        self.currentDate = $0
    }
}}

但是如果我在 Scope 之后添加 onReceiveList它不起作用,如果我在声明navigationBarItems. 所以我的问题是为什么 onReceive 在代码中放置不同时表现不同。我知道修饰符的顺序会改变最终生成的 UI,但对于onReceive. 我正在为此寻找可能的解释。

我正在使用:Xcode 11.5 Simulator iPhone SE(第二代),13.5。

标签: swiftswiftuicombine

解决方案


这不是解决方案,也不是解释,只是进一步评论:

如果您将计时器延长到

private let timer = Timer.publish(every: 1.0, on: .main, in: .common)
        .autoconnect()
        .print()
        .eraseToAnyPublisher()

你会得到

receive subscription: (Timer)
request unlimited
request unlimited
receive cancel
receive subscription: (Timer)
request unlimited
request unlimited

如果您在所有其他地方(如文本或导航)将 onReceive 放入列表中,您只会得到

receive subscription: (Timer)
request unlimited
request unlimited

所以我认为以某种方式在列表中发布者将被取消并重新启动,这可能是“不工作”的原因


推荐阅读