SwiftUI APN背景更新会影响UI

问题描述

我正在编写类似于Apple内置消息传递应用程序的文本消息传递应用程序。

一个视图(如Apple的视图)显示了从每个收件人接收或发送的最新文本,以及“消息传递”(Messaging),单击该行会将您带到该收件人的聊天视图。

在每个视图上,我声明以下内容以在接收到后台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
  }
}

似乎可以正常工作。