首页 > 解决方案 > 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)
    }
}

标签: iosswiftxcodealamofire

解决方案


推荐阅读