Извлечение значений из ответа API для событий с использованием fscalendar в swift

#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