在tableview中使用parse.com图像时出错

时间:2014-09-24 06:19:21

标签: ios image uitableview swift parse-platform

我正在运行此代码,用于基于解析查询创建tableview。它有效,问题是我得到以下错误:

2014-09-24 01:09:32.187 inventario [253:20065]警告:正在主线程上执行长时间运行的Parse操作。中断warnParseOperationOnMainThread()以进行调试。

使用" var datta = image?.getData()"使图像到位。有什么想法吗?

{       
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("ModeloEquipoInventarioCell", forIndexPath: indexPath) as UITableViewCell;

            let sweet:PFObject = self.timelineData.objectAtIndex(indexPath.row) as PFObject

            cell.textLabel?.text = sweet.objectForKey("Modelo") as? String
            cell.detailTextLabel?.text = sweet.objectForKey("Marca") as? String

            // This part is the problem
            var image = sweet.objectForKey("Foto3") as? PFFile
            var datta = image?.getData()
            cell.imageView?.image = UIImage(data: datta!)

            cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator

            return cell
        }

查询的方法是:

{  @IBAction func loadData(){

        var findTimelineData:PFQuery = PFQuery(className: "InventarioListado")
        findTimelineData.whereKey("Categoria", equalTo: toPassInventario)
        findTimelineData.whereKey("Descripcion", equalTo: toPassModeloEquipoInventario)
        //findTimelineData.orderByAscending("Descripcion")
        findTimelineData.limit = 500

        findTimelineData.findObjectsInBackgroundWithBlock{
            (objects:[AnyObject]!, error:NSError!)->Void in

            if error == nil{
                for object in objects{
                    let sweet:PFObject = object as PFObject

                    let sweeter:NSString! = sweet.objectForKey("Modelo") as? NSString
                    var filtro = self.categoriasFiltradasDeInventario.containsObject(sweeter!)
                    if (filtro == false) {
                        self.categoriasFiltradasDeInventario.addObject(sweeter)
                        self.timelineData.addObject(sweet)
                    }
                    self.tableView.reloadData()

                }
            }

        }
    }

}

2 个答案:

答案 0 :(得分:1)

问题是 getData()功能通过网络连接加载数据,下载图像可能需要一些时间。在此期间您的主线程将被阻止,因此强烈建议您在后台运行它。您可以使用 getDataInBackgroundWithBlock()轻松完成此操作。

let image = sweet["Foto3"] as PFFile
image.getDataInBackgroundWithBlock {
    (imageData: NSData!, error: NSError!) -> Void in
    if error == nil {
       cell.imageView?.image = UIImage(data:imageData)
    }
}

答案 1 :(得分:0)

  • 编程中有一个基本概念,Run the UI code on UI thread and Non-UI code in Non-UI thread.

  • 运行CPU密集型代码,例如网络电话,I / O呼叫等,应该在Non-UIthread/Background thread.

  • 解析获取图片的查询是在后台线程上进行的网络调用,因此用户界面不会受到攻击

  • 使用shared NSOperationQueue拍摄查询。