防止在Swift中重复加载可重用的单元格

时间:2015-07-21 20:41:25

标签: ios swift uitableview parse-platform tableviewcell

我是Swift语言的新手,我遇到了一个问题...

在"我的个人资料" tableview,我查询(到Parse)所有currentUser()的帖子,其中包含指向其他类的标记对象的指针数组的includeKey。

对于每个帖子,我必须为每个根据其"类型"标记的对象设置不同的颜色。 (使用AttributedStrings连接字符串)

我发现每次向下滚动时单元格都在重新加载,但问题是代码变得非常沉重和缓慢。

您是否了解我如何解决这个问题或如何防止细胞被重复使用?

非常感谢。

这是我来自cellForRowAtIndexPath()的代码:

    cell.selectionStyle = UITableViewCellSelectionStyle.None

    // pour activer la selection de cellules
    // cell.selectionStyle = UITableViewCellSelectionStyleBlue;(By Default)
    // cell.selectionStyle = UITableViewCellSelectionStyleGray;

    var imageToLoad = self.images[indexPath.row] as PFFile
    var imageCaption = self.imageCaptions[indexPath.row] as String
    var imageDate = self.imageDates[indexPath.row] as String
    var postKooleqts: AnyObject = self.kooleqts[indexPath.row] as AnyObject

            imageToLoad.getDataInBackgroundWithBlock{(imageData, error) -> Void in
        if (error == nil){

            var finalizedImage = UIImage(data:imageData!)
            cell.postImage.image = finalizedImage

        }
    }

    cell.postCaption.text = imageCaption
    cell.postDate.text = imageDate
    cell.nbKooleqts.text = "\(postKooleqts)"

    var x = 0
     var htmlString = ""

        if (linkedPages[indexPath.row].count > 0){
        while x < linkedPages[indexPath.row].count {

            println("indexx : \([indexPath.row])")
            println("stringg : \(htmlString)")

            let pageToAdd = linkedPages[indexPath.row][x]["name"] as! String

            //let test = linkedPages[indexPath.row][x]

            //println("resultat \([indexPath.row]) : \([test])")

            if (linkedPages[indexPath.row][x]["type"] as! String == "obj"){
            stringToAdd = "<span style=\"font-family : HelveticaNeue; font-size : 15;  color: white;\"><span style=\"font-weight: bold; color: #c00b0b\">\(pageToAdd) </span>- -</span>"
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "bra"){
            stringToAdd = "<span style=\"font-family : HelveticaNeue; font-size : 15;  color: white;\"><span style=\"font-weight: bold; color: #0099ff\">\(pageToAdd)</span>- -</span>"
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "peo"){                let stringToAdd = "<span style=\"font-family : HelveticaNeue; font-size : 15; color: white;\"><span style=\"font-weight: bold; color: #0bdf6a\">\(pageToAdd)</span>- -</span>"
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "eve"){
            stringToAdd = "<span style=\"font-family : HelveticaNeue; font-size : 15;  color: white;\"><span style=\"font-weight: bold; color: #cc99ff\">\(pageToAdd)</span>- -</span>"
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "pla"){
            stringToAdd = "<span style=\"font-family : HelveticaNeue; font-size : 15;  color: white;\"><span style=\"font-weight: bold; color: #e16818\">\(pageToAdd)</span>- -</span>"
            } else {stringToAdd = ""}

            htmlString = htmlString + "\(stringToAdd)"

            var encodedData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
            var attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
            let attributedString = NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil, error: nil)

            cell.linkedPages.attributedText = attributedString

            x++

            }

        }else {

            println("empty")

            cell.linkedPages.text = ""

    }

    return cell
}

更新:LinkedPages似乎是主要的滞后问题,就好像我将其删除,它不再滞后

UPDATE2 :这是前/后的工作代码,不再有滞后:

 var x = 0
     var htmlString = ""
    var attributedString = NSMutableAttributedString()

    var attrs:[String : AnyObject]?

        if (linkedPages[indexPath.row].count > 0){

        while x < linkedPages[indexPath.row].count {

            //println("indexx : \([indexPath.row])")
            //println("stringg : \(htmlString)")

            var pageToAdd = linkedPages[indexPath.row][x]["name"] as! String

            attributedString = NSMutableAttributedString(attributedString: attributedString)
            var addComma = NSMutableAttributedString(string: ", ")

            var paraStyle = NSMutableParagraphStyle()
            paraStyle.paragraphSpacing = 15.0

            if (linkedPages[indexPath.row][x]["type"] as! String == "obj"){
                attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15.0), NSForegroundColorAttributeName : UIColor(red: 192.0/255.0, green: 11.0/255.0, blue: 11.0/255.0, alpha: 1.0), NSParagraphStyleAttributeName : paraStyle]
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "bra"){
                attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15.0), NSForegroundColorAttributeName : UIColor(red: 12.0/255.0, green: 153.0/255.0, blue: 255.0/255.0, alpha: 1.0), NSParagraphStyleAttributeName : paraStyle]
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "peo"){
            attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15.0), NSForegroundColorAttributeName : UIColor(red: 11.0/255.0, green: 223.0/255.0, blue: 106.0/255.0, alpha: 1.0), NSParagraphStyleAttributeName : paraStyle]
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "eve"){
            attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15.0), NSForegroundColorAttributeName : UIColor(red: 204.0/255.0, green: 153.0/255.0, blue: 255.0/255.0, alpha: 1.0), NSParagraphStyleAttributeName : paraStyle]
            }
            else if (linkedPages[indexPath.row][x]["type"] as! String == "pla"){
            attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15.0), NSForegroundColorAttributeName : UIColor(red: 225.0/255.0, green: 90.0/255.0, blue: 1.0/255.0, alpha: 1.0), NSParagraphStyleAttributeName : paraStyle]
            }


            var coloredString = NSMutableAttributedString(string:"\(pageToAdd)", attributes:attrs)

            attributedString.appendAttributedString(coloredString)
            attributedString.appendAttributedString(addComa)


            cell.linkedPages.attributedText = attributedString

            x++

            }

        }else {

            println("empty")

            cell.linkedPages.text = ""

    }

            return cell

2 个答案:

答案 0 :(得分:1)

可能的原因是您为每个单元格中的图像调用了getData()。据我所知,没有办法不重复使用单元格,因为该方法的设计目的非常简单。这种速度变慢的原因是操作系统正在尝试等待加载每个图像以显示单元格,这样做会很快陷入困境。相反,您需要为单元格设置默认图像,然后调用var imageData = imageToLoad.getDataInBackground({})。这将允许在滚动时返回单元格,然后在加载图像之后填充图像,而不是等待绘制单元格直到检索到图像。

答案 1 :(得分:0)

为什么不实施图像缓存,而不是每次创建单元格时都进行下载,检查并查看是否尚未下载图像,以及是否使用了以前下载的副本。

您必须根据内存要求调整缓存大小,并弹出远离当前位置的图像。

你的代码还有另外一个问题,如果你真的很快向下滚动它会排队很多很多下载。理想情况下,您需要有一种方法可以取消不再查看的单元格的下载,或者在表格停止滚动之前停止后台下载。