1
我有一個應用程序,它使用Alamofire從我的服務器檢索json數據。我使用SwiftyJSON解析這個json數據,然後填充我的表格視圖。但是,我的性能有問題,速度很慢,需要6秒鐘的時間才能將表格視圖與接收到的數據(90個訂單)一起加載,並且隨着訂單數量的增加需要更長的時間。我不認爲問題出在Alomofire上。如何快速解析和填充我的表格視圖,類似於Twitter或Facebook?這是我所擁有的如何使用大JSON數據更快地填充tableview
// Order class
class Order {
var id:Int
var firstName:String
var lastName:String
var shippingAddress1:String
var dateTime:String
var total:String
var status:String
init(id:Int, firstName:String, lastName:String, shippingAddress1:String, dateTime:String, total:String, status:String){
self.id = id
self.firstName = firstName
self.lastName = lastName
self.shippingAddress1 = shippingAddress1
self.dateTime = dateTime
self.total = total
self.status = status
}
}
下面是我的訂單表視圖控制器代碼。
var api = API() // Making Alamofire requests
var orders = [Order]() // Order model
override func viewDidLoad() {
super.viewDidLoad()
self.makeCall() // Make api call to server
}
func makeCall(){
// Get orders
self.api.call(to: "orders?filter[limit]=100") { (result:NSDictionary?, error) ->() in
if error == nil{
self.setOrdersData(result!) // Received data
}
}
}
func setOrdersData(data:NSDictionary){
let json = JSON(data) // SwiftyJSON
let qos = Int(QOS_CLASS_USER_INITIATED.value)
// Process it in the background
dispatch_async(dispatch_get_global_queue(qos, 0), {() -> Void in
// Loop through the orders and parse them
for index in 0...json["orders"].count-1{
let id:Int = json["orders"][index]["id"].intValue
let firstName = json["orders"][index]["shipping_address"]["first_name"].stringValue
let lastName = json["orders"][index]["shipping_address"]["last_name"].stringValue
let shippingAddress1 = json["orders"][index]["shipping_address"]["address_1"].stringValue
let dateTime = json["orders"][index]["completed_at"].stringValue
let total = json["orders"][index]["total"].stringValue
let status = json["orders"][index]["status"].stringValue
// Append order to Order model
self.orders.append(Order(id: id, firstName: firstName, lastName: lastName, shippingAddress1: shippingAddress1, dateTime: dateTime, total: total, status: status))
}
// Get the main thread
dispatch_async(dispatch_get_main_queue(), {() -> Void in
self.orders.sort({$0.id > $1.id}) // Sort orders
self.tableView.reloadData() // Reload tableView
})
})
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:OrdersTableViewCell = tableView.dequeueReusableCellWithIdentifier("orderCell", forIndexPath: indexPath) as! OrdersTableViewCell
let order = self.orders[indexPath.row]
cell.labelAddress.text = order.shippingAddress1.capitalizedString
var fullName:String = order.firstName + " " + order.lastName
cell.labelFullName.text = fullName.capitalizedString
cell.labelAmount.text = "$\(order.total)"
cell.labelStatus.text = order.status
cell.labelTime.text = "\(order.dateTime)"
return cell
}
如果從json獲取數據的模塊需要時間,那麼我們應該怎麼做? –
1)嘗試不同的JSON庫。 2)重構JSON包。 3)改變設計,所以你不必解開*所有*的JSON之前,你可以繪製的東西,只是一次解析一個塊。無論如何,這些都是一些想法。 –