2015-04-23 31 views
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 
} 

回答

1

解決性能問題的第一步是配置文件。哪部分代碼很慢?可以使用Xcode中的性能分析工具,也可以將這些代碼分成不同的函數(無論如何都是個好主意),並測量每個函數的運行時間。當你看到代碼的哪一部分花費最多的時間時,你可以制定一個計劃來改變這個部分。

+0

如果從json獲取數據的模塊需要時間,那麼我們應該怎麼做? –

+1

1)嘗試不同的JSON庫。 2)重構JSON包。 3)改變設計,所以你不必解開*所有*的JSON之前,你可以繪製的東西,只是一次解析一個塊。無論如何,這些都是一些想法。 –