我必须从远程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服务器获取整个数据,并尝试从客户端的角度优化所有内容。谢谢。