如何将数据从可解码模型传递或实现到 ViewController?

Posted

技术标签:

【中文标题】如何将数据从可解码模型传递或实现到 ViewController?【英文标题】:How to pass or implement the data from decodable model to ViewController? 【发布时间】:2020-06-17 14:00:35 【问题描述】:

我不知道如何将数据从可解码模型传递或实现到视图控制器。而且我在我的视图控制器中期待状态 200 或消息“成功”。所以我可以把它放在我的 UIButton 中,向用户显示服务器已连接。

我不久前尝试了 debugPrint(response),API 工作正常。

我的模特

struct ServerStatus: Decodable 

    let status: Int?
    let service: String?
    let function: String?
    let msg: String?

  enum CodingKeys: String, CodingKey 

    case status = "status"
    case service = "service"
    case function = "function"
    case msg = "msg"
  

我使用 Alamofire 5.0 的 API 调用

class APIManager 
    static let sharedInstance = APIManager()

    let headers: HTTPHeaders = [
         .authorization(APIDefinitions.api_id)
    ]

    func fetchServerStatus(parameters: Parameters, completion:@escaping (_ data: ServerStatus?, _ error: String?) -> Void)
        AF.request(APIDefinitions.getServerStatus, method: .get, headers: headers).responseDecodable(of: ServerStatus.self)  (response) in
            print(response)
            switch response.result
                case .success(let serverStatus):
                    completion(serverStatus, nil)
                    break
                case .failure( _):
                    completion(nil, "The Internet connection appears to be offline.")
                    break
            
        
    

【问题讨论】:

您的 ViewCotroller 代码在哪里? 只有 touchUpInside IBAction func onlineModePressed(_ sender: Any) 和 IBOutlet weak var connect: UIButton! 【参考方案1】:

您已经处理过网络部分的 APIManager。现在你只需要在 ViewController 的viewDidLoad 中调用这个函数,像这样:

class ViewController: UIViewController 
    let button = UIButton()
    override func viewDidLoad() 
        super.viewDidLoad()
        APIManager.sharedInstance.fetchServerStatus(parameters: nil)  (response, error) in
            if let error = error 
                button.setTitle("Connection Failed", for: .normal)
             else if let status = status 
                if response.status == 200 || response.msg == "success" 
                    button.setTitle("Connected", for: .normal)
                 else 
                    button.setTitle("Connection Failed", for: .normal)
                
            
        
    

【讨论】:

我应该在完成参数中添加什么我的好先生? 哪个完成参数? 谢谢,它现在可以在您的解决方案中使用,只是根据我的喜好做了一些小改动。 @Chi 如果答案有效,则将其标记为正确并在可能的情况下投票。

以上是关于如何将数据从可解码模型传递或实现到 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何从可枚举转换为特定模型

从可修订版获取模型“identifiableName()”

如何将变量从 jQuery draggable 传递到 droppable

解码器的输出表面如何传递到编码器的输入表面?

从可打开的 URI 将本机 fd int 传递给 FFMPEG

如何将 List<Model> 从 Activity 传递到 Fragment