Как разобрать json данные в динамические c коллекции, просмотр разделов и ячеек в быстром - PullRequest
0 голосов
/ 18 февраля 2020

Это ответ json, который я получаю от почтальона после выполнения сетевого запроса

[
    {
        "employeeName": "Find a Sub ",
        "startDate": "2020-02-25",
        "startTime": "09:00:00",
        "endTime": "16:00:00"   
    },

   {
        "employeeName": "Find a Sub ",
        "startDate": "2020-02-25",
        "startTime": "09:00:00",
        "endTime": "16:00:00"
    },

{
        "employeeName": "Find a Sub ",
        "startDate": "2020-02-25",
        "startTime": "09:00:00",
        "endTime": "16:00:00"
    },

{
        "employeeName": "Find a Sub ",
        "startDate": "2020-02-24",
        "startTime": "09:00:00",
        "endTime": "16:00:00"  
    },

{ 
        "employeeName": "Find a Sub ",
        "startDate": "2020-02-24",
        "startTime": "09:00:00",
        "endTime": "16:00:00"     
    }]

Это структура моей модели, в которой я анализирую свои json данные

struct jobsData:Decodable
{
    let employeeName:String?
    let startTime:String?
    let endTime:String?
    var startDate:String?

    init(employeeName:String?=nil,
         startTime:String?=nil,
         endTime:String?=nil,
         startDate:String?=nil){

        self.employeeName=employeeName
        self.startTime=startTime
        self.endTime=endTime
        self.startDate=startDate
    }}

Я использую json декодер для декодирования данных, поступающих после запроса urlSession. Теперь мне нужно манипулировать ответом таким образом, чтобы количество разделов uicollectionview было бы startDate, а его текст заголовка был бы его текстом, например, в В приведенном выше случае будет два раздела uicollectionview. Элементами каждого раздела будет количество объектов в ответе json, соответствующее этой дате, как в предыдущем случае, в разделе будет три элемента с датой 2020-02-25 и два элемента в разделе с датой 2020-02-24. у меня проблема в том, что я не знаю ни одного из разделов и ни одного из элементов в каждом разделе, так как данные являются динамическими c, которые поступают из API. как я могу манипулировать ответом json, чтобы добавить их в uicollectionview, как я уже говорил { ссылка } эта ссылка была полезной, но я не знаю, как отсортировать мои данные, так как в приведенной выше ссылке было только два ключа, один для сортировки, а другой для сбора данных, но у меня несколько ключей.

Отредактировано: это моя функция источника данных коллекции. Как я могу показать данные в разных разделах

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)as! AvailableJobsCell
    let sTime=self.timeInAmPm(String: UserInformation[indexPath.item].startTime!)
    let eTime=self.timeInAmPm(String: UserInformation[indexPath.item].endTime!)
    cell.jobAddedTime.text="\(sTime) - \(eTime)"
    cell.jobTitle.text=UserInformation[indexPath.item].employeeName!
    cell.schoolName.text="\(UserInformation[indexPath.item].organizationName ?? "")\n\(UserInformation[indexPath.item].organizationAddress ?? "")"
    cell.jobNo.text=UserInformation[indexPath.item].confirmationNumber!
    cell.personOnHiatus.text=UserInformation[indexPath.item].positionDescription!
    cell.index=indexPath
    cell.delegate=self
        return cell
}

Информация пользователя имеет тип [JobsData]

1 Ответ

0 голосов
/ 18 февраля 2020

Прежде всего объявите структуру с именем в верхнем регистре, с необязательными элементами и без метода init.

struct JobsData : Decodable
{
    let employeeName : String
    let startTime : String
    let endTime : String
    var startDate : String
}

Для группировки данных объявите Section struct

struct Section
{
    let title : String
    let jobsData : [JobsData]
}

и объявить массив источника данных

var sections = [Section]()

После декодирования массива

let jobsDataArray = try JSONDecoder().decode([JobsData].self, from: data)

сгруппировать его с Dictionary(grouping:by:), map в массив Section и sort it

let grouped = Dictionary(grouping: jobsDataArray, by: {$0.startDate})
self.sections = grouped.map{Section(title: $0.key, jobsData: $0.value)}
                      .sorted{$0.title < $1.title}

Можно даже отсортировать элементы JobsData в разделах одновременно, например, по startTime

self.sections = grouped.map{Section(title: $0.key, jobsData: $0.value.sorted{$0.startTime < $1.startTime})}
                      .sorted{$0.title < $1.title}

Для отображения разделов используйте методы источника данных

override func numberOfSections(in collectionView: UICollectionView) -> Int
    return sections.count
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return sections[section].jobsData.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! AvailableJobsCell
    let jobData = sections[indexPath.section].jobsData[indexPath.item]
    let sTime = self.timeInAmPm(String: jobData.startTime)
    let eTime = self.timeInAmPm(String: jobData.endTime)
    cell.jobAddedTime.text = "\(sTime) - \(eTime)"
    cell.jobTitle.text = jobData.employeeName
    cell.schoolName.text = "\(jobData.organizationName ?? "")\n\(jobData.organizationAddress ?? "")"
    cell.jobNo.text = jobData.confirmationNumber!
    cell.personOnHiatus.text = jobData.positionDescription!
    cell.index = indexPath
    cell.delegate = self
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...