Так что я никогда раньше не использовал 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)
}
}