【问题标题】:SwiftUI APN Background Updates affecting UI影响 UI 的 SwiftUI APN 后台更新
【发布时间】:2020-09-07 21:22:19
【问题描述】:

我正在编写一个类似于 Apple 内置消息应用程序的短信应用程序。

像 Apple 的第一个视图显示从每个收件人接收或发送的最新文本,并且像消息传递一样,点击该行将带您进入该收件人的聊天视图。

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

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

然后:

.onReceive(pub) { (output) in
  self.msgsVM.fetchHeaderTexts()
}

更新数据。我在聊天视图中有相同的代码来更新该特定线程的文本。

问题是,当用户点击聊天视图时,随后会收到通知,父视图的 UI 无效,将用户踢出聊天视图并返回主视图。

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift swiftui apple-push-notifications


    【解决方案1】:

    我不确定这是否是一个非常优雅的修复,但这似乎有效:

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

    @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
      }
    }
    

    似乎有效。

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多