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
而您还没有给它一个值。你的fetchData
是async
你的print
在fetchData
完成之前运行。另外,如果您想使用initialize like that,请将您的ObservedObject
切换为StateObject
。
那么我如何在打印之前运行 fectData 函数?而且我已经尝试过使用 StateObject,仍然给了我和以前一样的结果
dataTask
是async
,因为它使用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项目文件夹显示错误但未在文件夹内的任何文件中显示错误
Xdebug 已安装但未在 Xampp 的 Phpinfo 中显示
AWS SNS - 推送 GCM 显示为从 Cloudwatch 发送但未在移动设备中接收
连接到 slack api 中的 chat.postMessage 的 CORS 策略错误,标头已设置但未在 React 和 Redux 中设置 [重复]