【问题标题】:How to pass or implement the data from decodable model to ViewController?如何将数据从可解码模型传递或实现到 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!

标签: ios swift xcode alamofire


【解决方案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 如果答案有效,则将其标记为正确并在可能的情况下投票。
猜你喜欢
  • 2018-12-25
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多