这是一个非常简单的视图:
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版本。
半路!
答案 0 :(得分:1)
我认为是因为最初没有数据,并且滚动视图折叠到无法增长的状态。尝试以下
struct ContentView: View
{
@ObservedObject var doctestModel : DoctestModel
var body: some View
{
ScrollView
{
Text(doctestModel.output).frame(maxWidth: .infinity)
}
}
}