#ios #swift #api #parsing #fscalendar
#iOS #swift #API #синтаксический анализ #fscalendar
Вопрос:
У меня есть fscalendar, который показывает список событий, забронированных из ответа API. Данные Json выглядят следующим образом:
{
"status": 200,
"schedule_data": {
"2020_08_16_1597485600": {
"schedule_date": "2020-08-16",
"nanny_id": 2,
"shift_start": "06:00",
"shift_end": "13:00",
"schedule_id": 112
},
"2020_08_16": {
"schedule_date": "2020-08-16",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_17_1597485600": {
"schedule_date": "2020-08-17",
"nanny_id": 2,
"shift_start": "06:00",
"shift_end": "22:00",
"schedule_id": 113
},
"2020_08_17": {
"schedule_date": "2020-08-17",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_18": {
"schedule_date": "2020-08-18",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_19": {
"schedule_date": "2020-08-19",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_20": {
"schedule_date": "2020-08-20",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_21": {
"schedule_date": "2020-08-21",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_22": {
"schedule_date": "2020-08-22",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_23": {
"schedule_date": "2020-08-23",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_24": {
"schedule_date": "2020-08-24",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_25": {
"schedule_date": "2020-08-25",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_26": {
"schedule_date": "2020-08-26",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_27": {
"schedule_date": "2020-08-27",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_28": {
"schedule_date": "2020-08-28",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_29": {
"schedule_date": "2020-08-29",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_30": {
"schedule_date": "2020-08-30",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
},
"2020_08_31": {
"schedule_date": "2020-08-31",
"nanny_id": 2,
"shift_start": "",
"shift_end": "",
"schedule_id": 0
}
}
}
Я извлек события из этого ответа api на основе schedule_id, где оно не равно нулю.Таким образом, у меня есть два события (16-8-2020, 17-8-2020), и я сохранил их в массиве.События отображаются в fscalendar с использованием метода делегирования fscalendar, как указано ниже:
функция calendar(_ calendar: FSCalendar, didSelect date: Дата, в monthPosition: FSCalendarMonthPosition) {
self.scheduleview.isHidden = false
self.mainview.addSubview(self.scheduleview)
self.todaydateLbl.text = "Availablity on " self.formatter.string(from: date)
self.selectdate = self.formatter.string(from: date)
print("calendar did select date (self.formatter.string(from: date))")
if monthPosition == .previous || monthPosition == .next {
calendar.setCurrentPage(date, animated: true)
}
}
У меня есть представление, которое отображается при нажатии на дату, которое является scheduleview.
Он показывает значение времени начала и окончания, если событие уже существует.
Как получить время начала и окончания события, которое уже существует.Например, когда пользователь выбирает 16-8-2020.Он должен иметь возможность видеть существующие сведения о событии, которые покажут ему время начала и окончания из ответа API.Как это сделать?
Код синтаксического анализа json приведен ниже:
let decoder = JSONDecoder()
do {
let user = try decoder.decode(ScheduleListModel.self, from: response.data!)
self.listdata = user
for schedule in self.listdata!.scheduleData {
if schedule.value.scheduleID != 0 {
self.eventsArray.append(schedule.value.scheduleDate!)
}
}
print("eventsarray is",self.eventsArray)
if self.eventsArray.count > 0
{
self.calendar.delegate = self
self.calendar.dataSource = self
self.calendar.reloadData()
}
} catch {
debugPrint(error)
}
Как получить подробную информацию из этих доступных данных?
Комментарии:
1. Что
ScheduleListModel
содержит? Есть ли у него массив объектов модели?
Ответ №1:
У вас есть "schedule_date": "2020-08-31"
в вашем ответе API, который, я полагаю, вы также сохраняете в своей модели данных. Итак, когда вы получите выбранную дату из calendar(_ calendar: FSCalendar, didSelect date: Date
метода, преобразуйте ее в формат, который вы сохранили в своей модели, и отфильтруйте свою модель данных.
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let selectedDateString = formatter.string(from: date)
let selectedEvents = scheduleData.filter { ($0.value.scheduleId != 0) amp;amp; ($0.value.scheduleDate == selectedDateString) }
Комментарии:
1. Это вернет только первый элемент. Я хочу повторить все элементы в коллекции.
2. ооо, я думал, что с 1 датой будет связано только одно событие. Вместо этого вы можете использовать
filter
. Просто заменитеfirst
наfilter
. Я обновил ответ3. таким образом, это даст мне массив events.so снова выполнять итерацию с этими событиями? Потому что, если scheduledate совпадает, есть два таких значения, одно с идентификатором расписания равно нулю, а другое с некоторым значением. Мне нужен тот, у которого идентификатор расписания не равен нулю.
4. Это зависит от того, как вы собираетесь отображать события на выбранную дату. Если это должно отображаться в tableview, вы можете напрямую использовать отфильтрованный массив. В противном случае вам придется выполнить итерацию и преобразовать его в ту форму, которую вы хотите.
5. необходимо отображать события в самом календаре. не в tableview