首页 > 解决方案 > 我可以强制 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()
  }
}

标签: jsonswiftuisynchronous

解决方案


推荐阅读