swiftui 视图不会更新,直到我最小化应用程序并再次打开它,即使我注入了模型
Posted
技术标签:
【中文标题】swiftui 视图不会更新,直到我最小化应用程序并再次打开它,即使我注入了模型【英文标题】:swiftui view is not updated until I minimize the app and open it again even though I inject the model 【发布时间】:2020-09-30 17:20:24 【问题描述】:这是一个非常简单的视图:
import SwiftUI
struct ContentView: View
@ObservedObject var doctestModel : DoctestModel
var body: some View
ScrollView
Text(doctestModel.output)
我将模型注入到 SceneDelegate 中的视图中,如下所示:
let contentView = ContentView(doctestModel: self.doctestModel)
这是我的 doctestModel:
import Foundation
import SwiftUI
import Combine
class DoctestModel : ObservableObject
@Published var output : String
var queue : DispatchQueue
init()
output = ""
let fd = rdi_hos_init()
queue = DispatchQueue(label: "doctest_thread", qos: .utility)
queue.async
// Some c code that will write to fd
rdi_hos_run_tests()
queue.async
let buf_len = 4096
let buf = UnsafeMutableRawPointer.allocate(byteCount: buf_len, alignment: 1)
var bytes_read = 0
while true
bytes_read = Darwin.read(fd, buf, buf_len)
assert(bytes_read != -1)
if bytes_read == 0
break
DispatchQueue.main.sync
self.output += String(bytesNoCopy: buf, length: bytes_read,
encoding: .utf8, freeWhenDone: false)!
buf.deallocate()
rdi_hos_run_close()
代码从某个 C 代码正在写入的管道中读取。我正在异步进行读取,但随后我在主线程中更新了 @Published 变量。
问题是在我最小化应用程序之前屏幕会是空白的,然后当我再次打开它时,视图将开始更新。
调试我发现我正在正确接收数据并且输出变量正在完美更新,但由于某种原因,在我最小化并再次打开之前视图不会更新。
我看到有人建议使用 StateObject,但我想针对稍旧版本的 ios。
停下来!
【问题讨论】:
【参考方案1】:我认为这是因为最初没有数据并且滚动视图已折叠到无法增长的状态。试试下面的
struct ContentView: View
@ObservedObject var doctestModel : DoctestModel
var body: some View
ScrollView
Text(doctestModel.output).frame(maxWidth: .infinity)
【讨论】:
以上是关于swiftui 视图不会更新,直到我最小化应用程序并再次打开它,即使我注入了模型的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 SwiftUI 视图不会在更新 @State var 时更新?
Swiftui Firebase RTDB 不会在视图中更新