Ios 影响用户界面的SwiftUI APN后台更新

Ios 影响用户界面的SwiftUI APN后台更新,ios,swift,swiftui,apple-push-notifications,Ios,Swift,Swiftui,Apple Push Notifications,我正在编写一个类似于苹果内置的短信应用程序的短信应用程序 第一个视图(如Apple的)显示从每个收件人收到或发送给每个收件人的最新文本以及类似的消息,点击该行可进入该收件人的聊天视图 在每个视图上,我声明以下内容,以便在收到后台APN通知时刷新数据: let pub = NotificationCenter.default.publisher(for: .AYSTextMessagesUpdate) 然后: .onReceive(pub) { (output) in self.msgsVM

我正在编写一个类似于苹果内置的短信应用程序的短信应用程序

第一个视图(如Apple的)显示从每个收件人收到或发送给每个收件人的最新文本以及类似的消息,点击该行可进入该收件人的聊天视图

在每个视图上,我声明以下内容,以便在收到后台APN通知时刷新数据:

let pub = NotificationCenter.default.publisher(for: .AYSTextMessagesUpdate)
然后:

.onReceive(pub) { (output) in
  self.msgsVM.fetchHeaderTexts()
}
更新数据。我在聊天视图中有相同的代码来更新特定线程的文本

问题是,当用户点击聊天视图,然后出现通知时,父视图的UI将失效,并将用户踢出聊天视图,返回主视图

我正在使用嵌入在第一个视图列表中的NavigationLink导航到聊天视图。当相应的数据刷新中出现通知时,父视图将失效,导致父视图(当前不是顶视图)的UI失效并重新绘制,用户将返回父视图

我要么需要将两个视图解耦,这样一个视图的更新不会使另一个视图无效,要么以某种方式阻止父视图上的数据刷新被推迟,直到显示该视图为止


任何帮助都将不胜感激。

我不确定这是否是一个非常优雅的解决方案,但这似乎有效:

在第一个视图中,我定义了这两个状态变量:

@State private var needsRefreshed = false
@State private var listDisplayed = true
然后在列表之后,我添加了以下内容:

.disabled(self.showNewMessage)
      .onAppear() {
        self.listDisplayed = true
        if self.needsRefreshed {
          self.msgsVM.fetchHeaderTexts()
          self.needsRefreshed = false
        }
      }
    .onDisappear() {
      self.listDisplayed = false
    }
然后我将.onReceive代码更改如下:

    .onReceive(pub) { (output) in
  if self.listDisplayed {
  self.msgsVM.fetchHeaderTexts()
  } else {
    self.needsRefreshed = true
  }
}
似乎有效