ios - AlamoFire5 空响应可解码
问题描述
因此,我以前从未使用过 AlamoFire,而且在 xCode/SwiftUI 中进行编码时,我也是一个新手。但是,当我尝试使用responseDecodable从我的服务器获取一些 Json 数据时,没有显示任何内容。看起来这只是不适用于我的 URL,而是我尝试的每个 URL。我也试过https。
AF.request("http://localhost:8000/api/events", headers: headers).responseDecodable(of: Welcome.self) { (response) in
guard let event = response.value else { return }
debugPrint(event.data[0].eventDetail)
当我使用函数responseJSON时,它可以完美运行并返回一个有效的 JSON 字符串。
请在下面查看我的模型。
struct Welcome: Decodable, Hashable {
let success: Bool
let data: [Data]
let message: String }
let id, createdByOrganisationID, eventAssignedToUserid, eventType: Int
let eventHeaderImage, eventTitle, eventDetail, eventSubtitle: String
let eventCost: Int
let eventCountryID: Int
let eventAddressType: Int
let startDate, endDate: String
var description: String {
return "\(eventTitle), id: \(id)"
}
enum CodingKeys: String, CodingKey {
case id
case createdByOrganisationID = "created_by_organisation_id"
case eventAssignedToUserid = "event_assigned_to_userid"
case eventType = "event_type"
case eventHeaderImage = "event_header_image"
case eventTitle = "event_title"
case eventDetail = "event_detail"
case eventSubtitle = "event_subtitle"
case eventCost = "event_cost"
case eventCountryID = "event_country_id"
case eventAddressType = "event_address_type"
case startDate = "start_date"
case endDate = "end_date"
}}
以及服务器返回的Json数据:
{
"success": true,
"data": [
{
"id": 1,
"created_by_organisation_id": 1,
"event_assigned_to_userid": 1,
"event_type": 1,
"event_header_image": "/image/",
"event_title": "EVENT_TITLE",
"event_detail": "TEXT",
"event_subtitle": "EVENT_SUB",
"event_cost": 500,
"event_country_id": 1,
"event_address_type": 0,
"start_date": "2020-12-02",
"end_date": "2020-12-03"
}
],
"message": "Events retrieved successfully."
}
我只是看不出我在这里做错了什么,因为我遵循了很多与 AlamoFire5 和 Swift5 做完全相同的事情的教程。
附言。我也在 Postman 中得到了正确的结果。
编辑 26-04-2020
现在我知道我得到了正确的结果
debugPrint(model.data[0].eventAssignedToUserid)
给出正确的值,这意味着下载的 JSON 确实存储在模型中,太棒了!现在我需要从视图中访问这些数据,而我根本不知道如何去做。我尝试添加var event: [Data]
到视图文件的顶部并访问它我使用:
ForEach(event, id: \.self) { item in
EventCardView(event: item)
}
在 EventCardView 中,我使用以下代码:
var event: Data //Top of view outside the Var body: some View {}
Text(event.eventTitle) //just a quick example of how I display a title
但不知何故,当我尝试显示任何内容时,这总是空的。
注意:因为我使用的是 tabView,所以我使用了一个名为 AppView 的文件,它是应用程序的起点。
//AppView.swift
var event: [Data] //Again outside of the body.
ContentView(event: event) //First item in tabView
要调用此函数,我使用 AppDelegate 中的“应用程序”函数来执行函数“fetchEvent”,因为我在启动时需要它,并且我也想在其他视图上使用它。
EventController().fetchEvent() { [weak self] (result) in
guard let this = self else { return }
this.handleResult(result)
}
private func handleResult(_ result: Result<Welcome, Error>) {
switch result {
case .success(let model):
debugPrint(model.data[0].eventAssignedToUserid) //this return the right value
case .failure(let error):
debugPrint(error)
}
}
解决方案
推荐阅读
- bots - Actions on Google - 我们可以为 Google Home 使用自定义语音吗?
- javascript - 如何创建多个对象并存储在一个对象中并传递给后端进程?
- jasmine - 开玩笑 - addEventListener ~ 点击断言
- java - IBM Domino 10 - 在 Java 中打开某些用户的日历(用于 createEntry)
- html - 仅将链接锚定到错误的页面位置一次
- r - 如何估计 R 中多边形交叉点的密度?
- php - Plesk 中的 SMTP 电子邮件发送失败,具有以下 DNS 设置
- javascript - 尝试添加功能以选择选项
- c# - 如何在 NewtonSoft JSON 树中使用 NULL 值?
- python-3.x - python中使用for循环的图像处理命令