在我最小化应用程序并再次打开它之前,swiftui视图不会更新,即使我注入了模型

时间:2020-09-30 17:20:24

标签: swift swiftui

这是一个非常简单的视图:

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 个答案:

答案 0 :(得分:1)

我认为是因为最初没有数据,并且滚动视图折叠到无法增长的状态。尝试以下

struct ContentView: View
{
    @ObservedObject var doctestModel : DoctestModel
    
    var body: some View
    {
        ScrollView
        {
            Text(doctestModel.output).frame(maxWidth: .infinity)
        }
    }
}