2016-08-05 3 views
0

Я пытаюсь получить данные из URL, используя swiftyJSON/Almofire:TableView замедлить приложение, и потребуется время, чтобы получить данные - swiftyJSON

вот мой код:

import UIKit 
import Alamofire 
import SwiftyJSON 

class NewsTableViewController: UITableViewController { 


var arrRes = [[String:AnyObject]]() //Array of dictionary 

override func viewDidLoad() { 
    super.viewDidLoad() 


    Alamofire.request(.GET, "myURL**").responseJSON { (responseData) -> Void in 
     if((responseData.result.value) != nil) { 
      let swiftyJsonVar = JSON(responseData.result.value!) 
      print(swiftyJsonVar) 
      if let resData = swiftyJsonVar[].arrayObject { 
       self.arrRes = resData as! [[String:AnyObject]] 
      } 
      if self.arrRes.count > 0 { 
       self.tableView.reloadData() 
      } 
     } 
     } 


    self.navigationController?.navigationBar.tintColor = UIColor(red:0.47, green:0.07, blue:0.55, alpha:1.00) 

} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("bCell", forIndexPath: indexPath) as! TableViewCell 

    var dict = arrRes[indexPath.row] 

    if let strImage = arrRes[indexPath.row]["image"] as? String{ 
     if let data = NSData(contentsOfURL: NSURL(string:strImage.encodeUTF8()!)!) { 
      cell.imgView.image = UIImage(data: data) 
     } 
    } 


    cell.titleLabel?.text = dict["title"] as? String 
    return cell 

} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return arrRes.count 
} 

TableView стал так что медленно, когда я прокручиваю, и требуется время для сбора данных !, у вас есть какие-то идеи, почему это так, также я следил за учебником для этого, и он не упомянул, почему он использовал Альмофир здесь, и что вы Выбирать данные из JSON-url? это называется «REST API»? так что я мог бы сделать хороший поиск на нем и хорошо начать, поскольку я новичок.

+1

Это из-за 'если let data = NSData (contentsOfURL: NSURL (string: strImage.encodeUTF8()!)!) {cell.imgView.image = UIImage (data: data)} 'Это в основном потоке. – Larme

+0

Возможный дубликат [как реализовать ленивую загрузку изображений в виде таблицы с помощью быстрого доступа) (http://stackoverflow.com/questions/28694645/how-to-implement-lazy-loading-of-images-in-table-view -Использование-быстро) – Larme

ответ

1

Потому что вы получаете изображение из URL в главном потоке:

 if let data = NSData(contentsOfURL: NSURL(string:strImage.encodeUTF8()!)!) { 
      cell.imgView.image = UIImage(data: data) 
     } 

Вы должны сделать это в фоновом потоке и когда вы получите данные вернуться в к главной теме:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     if let data = NSData(contentsOfURL: NSURL(string:strImage.encodeUTF8()!)!) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       image = UIImage(data: data) 
      }); 
     } 
});