AlamoFire5 Пустой ответDecodable - PullRequest
       10

AlamoFire5 Пустой ответDecodable

0 голосов
/ 24 апреля 2020

Так что я никогда раньше не использовал AlamoFire, и я тоже вроде новичка ie, когда дело доходит до кодирования в xCode / SwiftUI. Однако, когда я пытаюсь получить некоторые Json данные с моего сервера с responseDecodable , ничего не отображается. Похоже, это не относится к моему 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)

Когда я использую функцию response JSON, она отлично работает и возвращает действительную строку 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.

Ps. Я также получаю правильные результаты в Почтальоне.

РЕДАКТИРОВАТЬ 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

Для вызова этой функции я использую функцию 'application' в 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)
    }
}
...