Как упорядочить данные, поступающие из ответа JSON, и загрузить в таблицу в заданной последовательности

#ios #arrays #json #swift #dictionary

#iOS #массивы #json #swift #словарь

Вопрос:

Мне нужна ваша помощь, чтобы проанализировать ответ, поступающий из API, и обновить раздел таблицы и строку на основе предпочтения порядка «колоды» ключей.

Прямо сейчас я создаю словарь значений ключа, группируя аналогичный тип «колоды», но после группировки последовательности колод, поступающей из ответа, изменяется, что приводит к неупорядоченному словарю.

Вот мой код:

 func hitGetDVLData(dataDict: NSDictionary) {
    APIsHandler.getDVLVideos(postData: dataDict) { (result, response, error, errorMessage) in
        if let responseData = response {
            if( error == nil amp;amp; (responseData["status"] as AnyObject) as? Bool ?? false){
                if let responseData1 = responseData["data"] as? NSDictionary {
                    self.courseDataDict = responseData1 as! [String : Any]
                    if let topics = (responseData1["curriculam"] as? NSDictionary)?.value(forKey: "topics") as? [[String : Any]] {
                        // attached output below
                    
                        self.totalArrayCount = topics.count
                        let crossReference = Dictionary(grouping: topics, by: { $0["deck"] as! String })
                        
                        self.premimumVideoArray = [:]
                        self.premimumVideoArray =  crossReference
                        // attached output below
                    }

                self.tableviewHeightConstraint.constant = self.tableViewHeight
                self.tableView.reloadData()
               
               } 
            }
        }
    }
} 
  

Где courseDataDict amp; premimumVideoArray — это переменная, определяемая следующим образом

 var courseDataDict: [String : Any] = [:]

var premimumVideoArray : [String : [[String:Any]]] = [:]
  

ВЫВОД:

ответ:

 {
    data =     {
        "course_type" = 4;
        "cover_image" = "https://dams-apps-production.s3.ap-south-1.amazonaws.com/course_file_meta/8fa5367315f2b063d45c165095d5f4f4";
        "cover_video" = "";
        curriculam =         {
            title = "";
            topics =             (
                                {
                    completed = "";
                    deck = Preclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png";
                    title = Anatomy;
                    "topic_id" = 2243;
                    total = 47;
                },
                                {
                    completed = "";
                    deck = Preclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png";
                    title = Physiology;
                    "topic_id" = 2421;
                    total = 59;
                },
                                {
                    completed = "";
                    deck = Preclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png";
                    title = Biochemistry;
                    "topic_id" = 2245;
                    total = 35;
                },
                                {
                    completed = "";
                    deck = Paraclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png";
                    title = Pathology;
                    "topic_id" = 2419;
                    total = 97;
                },
                                {
                    completed = "";
                    deck = Paraclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png";
                    title = Pharmacology;
                    "topic_id" = 2412;
                    total = 95;
                },
                                {
                    completed = "";
                    deck = Paraclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png";
                    title = Microbiology;
                    "topic_id" = 2411;
                    total = 90;
                },
                                {
                    completed = "";
                    deck = Paraclinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png";
                    title = FMT;
                    "topic_id" = 2416;
                    total = 8;
                },
                                {
                    completed = "";
                    deck = "Clinicals (Prefinals)";
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png";
                    title = Ophthalmology;
                    "topic_id" = 2418;
                    total = 51;
                },
                                {
                    completed = "";
                    deck = "Clinicals (Prefinals)";
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png";
                    title = ENT;
                    "topic_id" = 2420;
                    total = 62;
                },
                                {
                    completed = "";
                    deck = "Clinicals (Prefinals)";
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png";
                    title = PSM;
                    "topic_id" = 2409;
                    total = 26;
                },
                                {
                    completed = "";
                    deck = Clinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png";
                    title = Medicine;
                    "topic_id" = 2637;
                    total = 137;
                },
                                {
                    completed = "";
                    deck = Clinicals;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png";
                    title = Surgery;
                    "topic_id" = 2638;
                    total = 83;
                },
                                {
                    completed = "";
                    deck = Clinicals;
                    "sub_img_url" = "";
                    title = "Obgamp;Gy";
                    "topic_id" = 2423;
                    total = 41;
                },
                                {
                    completed = "";
                    deck = Clinicals;
                    "sub_img_url" = "";
                    title = Paediatrics;
                    "topic_id" = 2246;
                    total = 27;
                },
                                {
                    completed = "";
                    deck = SARPO;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png";
                    title = Dermatology;
                    "topic_id" = 2415;
                    total = 27;
                },
                                {
                    completed = "";
                    deck = SARPO;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png";
                    title = Anesthesia;
                    "topic_id" = 2639;
                    total = 22;
                },
                                {
                    completed = "";
                    deck = SARPO;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png";
                    title = Radiology;
                    "topic_id" = 2406;
                    total = 31;
                },
                                {
                    completed = "";
                    deck = SARPO;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png";
                    title = Psychiatry;
                    "topic_id" = 2410;
                    total = 26;
                },
                                {
                    completed = "";
                    deck = SARPO;
                    "sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png";
                    title = Orthopaedics;
                    "topic_id" = 2414;
                    total = 35;
                }
            );
        };
        "desc_header_image" = "https://dams-apps-production.s3.ap-south-1.amazonaws.com/course_file_meta/7661839dvl.png";
        "for_dams" = 80000;
        "free_ids" = "78295,28,59809,176600,231590,164118,181331,230458,3066";
        gst = 18;
        "gst_include" = 1;
        id = 451;
        "is_purchased" = 1;
        "is_validity" = 0;
        learner = 21;
        mrp = 0;
        "non_dams" = 80000;
        "points_conversion_rate" = 100;
        rating = "0.0";
        "review_count" = 0;
        title = DVL;
        validity = 0;
    };
    error =     (
    );
    "is_ios_price" = 1;
    message = "Course information.";
    status = 1;
}
  

Темы:

 [["title": Anatomy, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png, "completed": , "topic_id": 2243, "deck": Preclinicals, "total": 47], ["total": 59, "title": Physiology, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png, "completed": , "topic_id": 2421, "deck": Preclinicals], ["total": 35, "deck": Preclinicals, "completed": , "title": Biochemistry, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png, "topic_id": 2245], ["total": 97, "title": Pathology, "completed": , "topic_id": 2419, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png, "deck": Paraclinicals], ["topic_id": 2412, "total": 95, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png, "completed": , "title": Pharmacology, "deck": Paraclinicals], ["deck": Paraclinicals, "total": 90, "completed": , "title": Microbiology, "topic_id": 2411, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png], ["sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png, "deck": Paraclinicals, "total": 8, "title": FMT, "completed": , "topic_id": 2416], ["topic_id": 2418, "deck": Clinicals (Prefinals), "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png, "title": Ophthalmology, "total": 51, "completed": ], ["title": ENT, "total": 62, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png, "topic_id": 2420, "completed": , "deck": Clinicals (Prefinals)], ["deck": Clinicals (Prefinals), "total": 26, "completed": , "topic_id": 2409, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png, "title": PSM], ["title": Medicine, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png, "topic_id": 2637, "total": 137, "deck": Clinicals, "completed": ], ["title": Surgery, "deck": Clinicals, "topic_id": 2638, "total": 83, "completed": , "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png], ["topic_id": 2423, "sub_img_url": , "deck": Clinicals, "title": Obgamp;Gy, "completed": , "total": 41], ["sub_img_url": , "topic_id": 2246, "title": Paediatrics, "deck": Clinicals, "completed": , "total": 27], ["title": Dermatology, "completed": , "deck": SARPO, "total": 27, "topic_id": 2415, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png], ["deck": SARPO, "total": 22, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png, "completed": , "title": Anesthesia, "topic_id": 2639], ["topic_id": 2406, "total": 31, "title": Radiology, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png, "completed": ], ["title": Psychiatry, "total": 26, "topic_id": 2410, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png, "completed": ], ["deck": SARPO, "completed": , "topic_id": 2414, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png, "title": Orthopaedics, "total": 35]]
  

Перекрестная ссылка:

 ["Paraclinicals": [["total": 97, "title": Pathology, "completed": , "topic_id": 2419, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png, "deck": Paraclinicals], ["topic_id": 2412, "total": 95, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png, "completed": , "title": Pharmacology, "deck": Paraclinicals], ["deck": Paraclinicals, "total": 90, "completed": , "title": Microbiology, "topic_id": 2411, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png], ["sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png, "deck": Paraclinicals, "total": 8, "title": FMT, "completed": , "topic_id": 2416]], "Clinicals (Prefinals)": [["topic_id": 2418, "deck": Clinicals (Prefinals), "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png, "title": Ophthalmology, "total": 51, "completed": ], ["title": ENT, "total": 62, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png, "topic_id": 2420, "completed": , "deck": Clinicals (Prefinals)], ["deck": Clinicals (Prefinals), "total": 26, "completed": , "topic_id": 2409, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png, "title": PSM]], "SARPO": [["title": Dermatology, "completed": , "deck": SARPO, "total": 27, "topic_id": 2415, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png], ["deck": SARPO, "total": 22, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png, "completed": , "title": Anesthesia, "topic_id": 2639], ["topic_id": 2406, "total": 31, "title": Radiology, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png, "completed": ], ["title": Psychiatry, "total": 26, "topic_id": 2410, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png, "completed": ], ["deck": SARPO, "completed": , "topic_id": 2414, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png, "title": Orthopaedics, "total": 35]], "Clinicals": [["title": Medicine, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png, "topic_id": 2637, "total": 137, "deck": Clinicals, "completed": ], ["title": Surgery, "deck": Clinicals, "topic_id": 2638, "total": 83, "completed": , "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png], ["topic_id": 2423, "sub_img_url": , "deck": Clinicals, "title": Obgamp;Gy, "completed": , "total": 41], ["sub_img_url": , "topic_id": 2246, "title": Paediatrics, "deck": Clinicals, "completed": , "total": 27]], "Preclinicals": [["title": Anatomy, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png, "completed": , "topic_id": 2243, "deck": Preclinicals, "total": 47], ["total": 59, "title": Physiology, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png, "completed": , "topic_id": 2421, "deck": Preclinicals], ["total": 35, "deck": Preclinicals, "completed": , "title": Biochemistry, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png, "topic_id": 2245]]]
  

Скриншоты:

Текущий снимок экрана 1

Текущий снимок экрана 2

Любой способ, как получить эти данные, чтобы моя последовательность группировки была в виде

[«Доклинические», «Параклинические», «Клинические (предварительные)», «Клинические», «SARPO»].

т.е. 1-й раздел — доклинические исследования и там строки, 2-й раздел — параклинические исследования и там строки, и так далее.

Заранее спасибо.

Комментарии:

1. Словари по определению неупорядочены.

2. Сократите свой вопрос и удалите ненужную информацию. Мне кажется, что у вас уже есть ответ, используйте массив, который вы указали в конце, и выполните цикл по нему и получите значения из вашего словаря в этом порядке.

3. @JoakimDanielson Но как??

4. @Magnas да, но как мне это нужно в отсортированном виде.

Ответ №1:

Я бы посоветовал вам изучить и использовать Codable вместо этого для вашего декодирования json и работы со структурами, чтобы ваш код был понятнее и с ним было проще работать.

Предполагая, что вы это сделаете, и у вас будет пользовательский тип, подобный приведенному ниже (то, что вы опубликовали, не соответствует json, поэтому я сделал некоторые предположения)

 struct Topic: Decodable {
    let topicId: Int
    let completed: String
    let deck: String
    let subImageUrl: String
    let title: String
    let total: Int

    enum CodingKeys: String, CodingKey {
        case topicId = "topic_id"
        case subImageUrl = "sub_img_url"
        case completed, deck, title, total
    }
}
  

Затем мы можем обернуть эту структуру в другой пользовательский тип, который соответствует вашим требованиям пользовательского интерфейса, с именем deck (я называю их здесь section) и массивом тем

 struct TopicSection {
    let section: String
    let topics: [Topic]
}
  

Итак, если у вас есть все ваши разделы из json в массиве topics , вы можете затем создать массив этой новой структуры, где содержимое поступает в порядке, указанном в вашем массиве названий разделов.

 let sectionNames = ["Preclinicals", "Paraclinicals", "Clinicals (Prefinals)", "Clinicals", "SARPO"]

var sections = [TopicSection]()

sectionNames.forEach { name in
    let section = TopicSection(section: name, topics: topics.filter { $0.deck == name})
    sections.append(section)
}
  

И затем вы можете использовать sections массив в качестве источника для вашего табличного представления. Конечно, TopicSection также можно было бы использовать даже без использования Codable , изменив тип topics на словарь, [String: Any]

Комментарии:

1. Спасибо за это, но мои названия разделов являются динамическими.

2. @SatishThakur Тогда как вы определяете порядок сортировки?

3. @SatishThakur есть какие-нибудь отзывы по этому поводу?