API 已获取但未在 SwiftUI 中显示任何数据

Posted

技术标签:

【中文标题】API 已获取但未在 SwiftUI 中显示任何数据【英文标题】:API is Fetched but not displaying any data in SwiftUI 【发布时间】:2021-05-10 13:23:24 【问题描述】:

它记录了类似“nw_protocol_get_quic_image_block_invoke dlopen libquic failed”的内容 但它有一个价值。

当我试图在视图中打印出来时,它根本不起作用 我做错了什么?

class MoneyView:ObservableObject 
    @Published var currency:Rate?
    
    init() 
        fetchData()
        print(self.currency!.CAD) // This does not have any value aka nil
    
    
    func fetchData() 
        print("Gajellas amat")
        guard let url = URL(string: "http://api.exchangeratesapi.io/v1/latest?access_key=24a5ab7688a7044f60bfeb491eb37550") else 
            return
        
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) (data, response, error) in
            if error == nil 
                let decoder = JSONDecoder()
                if let safeData = data 
                    do
                        let result =  try decoder.decode(Root.self, from: safeData)
                        DispatchQueue.main.async 
                            self.currency = result.rates
                            print(result.rates.CAD)
                            print("Ada ada aja -----------")
                            print(self.currency!.CAD) // This has value
                        
                        
                     catch 
                        print(error)
                    
                
            
        
        task.resume()
    


我的看法:

struct NewDisplay: View 
    @ObservedObject var fetch = MoneyView()
    var body: some View 
        Text(String(self.fetch.currency!.CAD))
        Text("Makan bang")
    

【问题讨论】:

这能回答你的问题吗? What does "Fatal error: Unexpectedly found nil while unwrapping an Optional value" mean? 为什么会有值?您只是在启动 class 而您还没有给它一个值。你的fetchDataasync 你的printfetchData 完成之前运行。另外,如果您想使用initialize like that,请将您的ObservedObject 切换为StateObject 那么我如何在打印之前运行 fectData 函数?而且我已经尝试过使用 StateObject,仍然给了我和以前一样的结果 dataTaskasync,因为它使用completion handler,所以在dataTask 完成之前,您无法设置为sync,您将拥有nil 值。好消息是,一旦async 工作完成,您将获得正确的值。我会在屏幕上放一个ProgressView,直到currency 不再是nil 【参考方案1】:

这是一个时间问题。 API 调用是异步的。

删除init方法

  init() 
    fetchData()
    print(self.currency!.CAD) // This does not have any value aka nil
  
罢工>

并获取onAppear 中的数据。替换

struct NewDisplay: View 
    @ObservedObject var fetch = MoneyView()
    var body: some View 
        Text(String(self.fetch.currency!.CAD))
        Text("Makan bang")
    

struct NewDisplay: View 
    @StateObject var fetch = MoneyView()
    var body: some View 
        Text(String(self.fetch.currency?.CAD ?? 0.0))
        Text("Makan bang")
    
    .onAppear 
       fetch.fetchData()
    

@ObservedObject 实际上是针对不属于当前视图的对象。

nil-coalescing 运算符 ?? 避免了崩溃,因为在第一次渲染视图时该值不可用(还)。

旁注:

消息 nw_protocol_get_quic_image_block_invoke dlopen libquic failed 无关紧要。

【讨论】:

假设我的口味需要放入init,我该如何解决?? 它也可以与init 方法一起使用。在任何情况下删除print 行。这是没有意义的。

以上是关于API 已获取但未在 SwiftUI 中显示任何数据的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse项目文件夹显示错误但未在文件夹内的任何文件中显示错误

MVC 部分视图已更新,但未在主视图中显示

Xdebug 已安装但未在 Xampp 的 Phpinfo 中显示

AWS SNS - 推送 GCM 显示为从 Cloudwatch 发送但未在移动设备中接收

连接到 slack api 中的 chat.postMessage 的 CORS 策略错误,标头已设置但未在 React 和 Redux 中设置 [重复]

Localhost端口已更改,但未在WordPress站点中反映出来