如何解决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
}
}
似乎可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。