为啥没有发出(或没有收到)significantTimeChangeNotification

Posted

技术标签:

【中文标题】为啥没有发出(或没有收到)significantTimeChangeNotification【英文标题】:Why is significantTimeChangeNotification not emitted (or not received?)为什么没有发出(或没有收到)significantTimeChangeNotification 【发布时间】:2021-04-10 17:43:52 【问题描述】:

我对 Swift 很陌生。出于学习目的,我正在创建一个小倒计时应用程序(距离 X 日期还有几天)。 这些倒计时显示在列表中。列表中的单个倒计时由以下视图表示。

struct CountdownRow: View 
  @State private var remainingDays: Int = 0
  @State private var progress: Float = 0.0
  
  var countdown: Countdown
  
  var body: some View 
    VStack
      HStack 
        Text(countdown.name)
          .font(.subheadline)
          .multilineTextAlignment(.leading)
          .padding(10)
        Spacer()
        Text(String(remainingDays))
          .font(.headline)
          .padding(10)
      
      ProgressView(value: progress)
        .padding(10)
    
    .onAppear 
      remainingDays = countdown.getRemainingDays()
      progress = countdown.getProgress()
    
    .onReceive(NotificationCenter.default.publisher(for:
        UIApplication.significantTimeChangeNotification), 
        perform:  _ in
      remainingDays = countdown.getRemainingDays()
      progress = countdown.getProgress()
    )
  

我想在午夜更新每个倒计时的剩余天数。但是当时间从 23:59 变为 0:00 时,.onReceive 修饰符不会触发。 接收其他通知(例如 UIApplication.willEnterForegroundNotification)会按预期工作。

为什么没有在午夜发出(或接收)此特定通知? 根据苹果的文档,它应该在午夜发出。

谢谢!

【问题讨论】:

【参考方案1】:

如果应用程序在前台,它会在午夜发出。您的应用程序在午夜处于前台吗?否则,您应该检查您返回前台的时间并相应更新。

这适用于所有 NSNotification。如果您的应用被暂停,它们将不会被接收。对于significantTimeChangeNotification,这不是特殊情况。

willEnterForegroundNotification 可能看起来很特殊,但仅在您的应用已重新启动的情况下才会发送。

也就是说,我强烈建议重新设计它,使 Countdown 成为一个 ObservableObject,并在适当的时间自我更新(通过观察显着TimeChangeNotification 和 willEnterForegroundNotification)。然后你可以将remainingDaysprogress 绑定到它,而不需要视图上的onAppearonReceive

【讨论】:

感谢您的详细解答。我非常感谢有关如何重新设计倒计时的建议,因为我不确定这里最好的方法是什么。无论如何,对我来说问题是 iPhone 模拟器。在我的真实设备上,一切都按预期工作。在 iPhone 12 模拟器中,未发出通知。我不确定这是否是预期行为 - 可能是一个错误。

以上是关于为啥没有发出(或没有收到)significantTimeChangeNotification的主要内容,如果未能解决你的问题,请参考以下文章

Qt:为啥我的按钮没有收到信号?

为啥我会收到 OleDbException:“没有为一个或多个必需参数提供值。”例外?

angularjs拦截器:为啥在$http拦截器中没有收到正确的状态码和消息

为啥我会收到错误:无法在 macOS Catalina 下运行 PySide2 程序的“uic”:“execvp:没有这样的文件或目录”?

为啥,我注册软件时没有收到验证码呢?

为啥我收到远程通知时没有发送本地通知?