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 视图不会更新

为啥我的 SwiftUI 视图不会在更新 @State var 时更新?

Swiftui Firebase RTDB 不会在视图中更新

SwiftUI - 更新@State 不会改变视图

SwiftUI - 尽管使用了 @Published 和 @ObservedObject,但视图不会更新

SwiftUI 中的计算(NSObject)属性不会更新视图