swift - 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。
解决方案
这不是解决方案,也不是解释,只是进一步评论:
如果您将计时器延长到
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
所以我认为以某种方式在列表中发布者将被取消并重新启动,这可能是“不工作”的原因
推荐阅读
- php - SQLSTATE [23000]:违反完整性限制:1062 'mail@mail.com' 'users_email_unique' 键的重复条目
- php - Alpha vantage API 不适用于 NSE,而同一查询为外国股票提供输出
- java - RefreshAheadCache 不调用 @cacheable 注释方法
- python - 如何为 Tacker 分解实现 mode-k 乘积 Python?
- smtp - SMTP 错误:DATA END 命令失败:550 5.7.1 客户端无权作为此发件人发送
- c# - 多个 RDLC 到单独页面上的单个 word 文档
- python - 在嵌套的 for 循环中过滤子数据框
- excel - 使用列中的值作为 json 请求的参数并组合表
- apache-kafka - 在 Streams 应用的所有实例中使用某个主题的所有消息
- css - 如何将 div 内的按钮与绝对位置居中对齐?