用swift解析大量的JSON数据

时间:2017-05-13 23:15:18

标签: ios arrays json swift uitableview

我必须从远程Web服务器获取大量数据。我决定使用Alamofire进行HTTP请求,使用Swifty JSON来解析JSON响应。当流程结束时,我将数据返回到UITableViewController并提供我的表格视图。由于JSON(1.5 MB)的大小,绑定到对象模型的过程需要额外的时间。 这是我在代码中处理过程的一个示例:

对象模型示例:

import Foundation
import SwiftyJSON

class Course {
    var id: String!
    var students: [JSON]
    var hours: [JSON]
    var related: [JSON]

    init?(_ key: String, json: JSON) {
        self.id = key
        self.students = json["students"].arrayValue
        self.calendar = json["calendar"].arrayValue
        self.relatedCourses = json["related_courses"].arrayValue
    }
}

Alamofire请求示例:

func fetchAllData(data: Data, completion: @escaping ([String:[String:Any]], [JSON]) -> ()) {) {
        let url = "http://myapi/data" // includes courses

        Alamofire.request(url, parameters: params)
            .validate()
            .responseJSON(queue: utilityQueue) {
                response in
                switch response.result {
                case .success(let responseData):
                    let (results, order) = self.parseResults(json: JSON(responseData))
                    completion(results, order)
                    break
                case .failure(let error):
                    AppDelegate.print(value: error)
                    break
                }
        }
    }

JSON解析示例:

func parseResults(json: JSON) -> ([String:[String:Any]], [JSON]){
            var results = [String:[String:Any]]()
            results["courses"] = getCourses(from: json)
            results["students"] = getStudents(from: json)
            ... I parse other elements here
            return (results, order)
        }

func getCourses(from json: JSON) -> [String:Course] {
    var courses = [String:Course]()
    for (key, data) : (String, JSON) in json["courses"] {
        courses[key] = Course(key, json: data)!
    }
    return places
}

我使用词典来减少访问元素的时间复杂度。我有很多信息要加入。

这里有TableViewController方法:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        // Call here fetch method
        ResultsService().fetchResults(data: data, completion: {
            (results, order) in
            DispatchQueue.main.async {
                self.courses = results["courses"]!
                self.students = results["students"]!
                ...
                self.spinner.stopAnimating()
                self.tableView.reloadData()
            }
        })
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CourseCell", for: indexPath) as! CourseCell

        let course = courses[orderedCourses[indexPath.row].stringValue] as! Course
        let bestStudent = students[course.students[0].stringValue] as! Student

        cell.courseName.text = course.name
        cell.bestStudentScore.text = bestStudent.score
        ...

        return cell
    }

一切正常,但我必须等待3或4秒才能在表格视图中显示数据。通过一些调试,我已经指出我的瓶颈是将JSON绑定到对象上。你有什么建议有助于提高表现吗?我在考虑类似的事情:开始解析JSON,返回小块数据并在表格视图中显示,但我不知道如何实现这一目标。我无法使用分页,因此我必须从Web服务器获取整个数据,并尝试从客户端的角度优化所有内容。谢谢。

0 个答案:

没有答案