json - 我可以强制 SwiftUI 代码同步吗
问题描述
我在一个结构中有一个静态计算属性,我在其中进行 Web 服务调用并希望返回 Web 服务的结果。然而,Web 服务调用是异步的,在调用完成之前,会返回一个值。
有什么方法可以强制此代码同步吗?或者你能建议任何其他解决这个问题的方法吗?
这是我的代码(我没有提供模型大师):
struct MasterControllerStruct {
static var isMasterPopulated = false
static var objMaster : Master.MasterDetails?
static let master : Master.MasterDetails? = {
if(isMasterPopulated == false)
{
var viewModel = ViewModel<Master>()
let url = URL(string: "URL Goes Here")!
let encoded = """
{
<JSON Parameters go here>
}
"""
let completion = {
objMaster = viewModel.modelData?.Data
isMasterPopulated = true
}
viewModel.getData(url: url, encoded: encoded, completion: completion)
return viewModel.modelData?.Data
}
else {
return objMaster
}
}()
}
class ViewModel<T: Codable> : ObservableObject {
@Published var modelData : T?
func getData(url: URL, encoded: String, completion: (@escaping ()->()) ) {
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let encoder = JSONEncoder()
if let data = try? encoder.encode(encoded) {
request.httpBody = data
}
URLSession.shared.dataTask(with: request) { data1, response, error in
if let error = error {
print("Request error: ", error)
return
}
guard let data1 = data1 else { return }
DispatchQueue.main.async {
let decoder = JSONDecoder()
if let data = try? decoder.decode(T.self, from: data1)
{
self.modelData = data
completion()
print("Success!")
}
else {
print("Does not decode correctly")
}
}
}.resume()
}
}
解决方案
推荐阅读
- swift - 如何查询添加到数据透视表的附加列(兄弟除外)?
- python - 无法在 python open cv 上使用此代码库录制视频
- dart - Flutter - 对单个导入而不是多个导入有影响吗?
- view - 在 Netlogo 中使用导出视图时编辑文件名
- java - android studio的以下代码中的错误是什么
- numpy - 切片索引必须是整数
- reactjs - 基于动态上下文值的 React Router
- laravel - 在 laravel 7 中,外键约束的格式不正确
- php - 此 php 代码在 localhost 中有效,但在服务器上无效?
- python - AttributeError:模块“django.contrib.auth.admin”没有属性“站点”