2014-12-07 53 views
1

我的表设置完美,当我滚动它,它调用cellForRowAtIndexPath加载实际行,它有滞后的第二秒冻结,并导致表不流畅。我做了一些研究,为什么会这样,就我的理解而言,这是因为我没有重复使用单元格。我很快就编程,而且我也很新。我想知道是否有人可以帮助修复我的Swift代码重用单元格,这样当我滚动表格时,它的流畅和滞后自由。UITableView cellForRowAtIndexPath问题与使用重用标识符

这里是我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     mainTableView.estimatedRowHeight = 50.0 
     mainTableView.rowHeight = UITableViewAutomaticDimension 
     var cell : postWithTitleAndImageTableViewCell = mainTableView.dequeueReusableCellWithIdentifier("postWithTitleAndImage") as postWithTitleAndImageTableViewCell 
     var imageID = json[indexPath.row]["imageName"] as String 
     var id = json[indexPath.row]["id"] as String 
     var isImage = json[indexPath.row]["isImage"] as String 
     var title = json[indexPath.row]["name"] as String 
     var text = json[indexPath.row]["post"] as String 
     var time = json[indexPath.row]["time"] as String 
     var popularity = json[indexPath.row]["popularity"] as String 
     //add clientid 
     //time handle in the cell class 
     lastID = id 
     cell.setCell(id, title: title, imageID: imageID, text: text, time: time, popularity: popularity) 
     return cell as postWithTitleAndImageTableViewCell 
    } 

如果我需要提供任何详细资讯,请让我知道。我修正这个问题非常重要。

编辑: 我发现性能问题在我的代码中。在我的自定义单元类中有一个setCell函数来设置单元格中的所有内容。在这段代码中,我有一个web请求来获取图像。这是一个必要的调用,所以我想解决性能问题。

这里是setCell:

public func setCell(id: String, title: String, imageID: String, text: String, time: String, popularity: String){ 
     println("setCell called") 
     readIDs.append(id) 
     postID = id 
     let colors = ["person-blue.png", "person-green.png", "person-orange.png", "person-pink.png", "person-purple.png", "person-red.png", "person-yellow.png"] 
     let randomIndex = Int(arc4random_uniform(UInt32(colors.count))) 
     var imageName = (colors[randomIndex]) 
     var cellHeight = TableViewCell.frame.height 
     let font = UIFont(name: "Arial Rounded MT Bold", size: 14.0) 
     labelHeightConstraint.constant = heightForView(text, font: font!, width: postText.frame.width) 
     postImage.clipsToBounds = true 
     var timeDouble = time as NSString 
     var phpTime = timeDouble.doubleValue 
     var currentDate = NSDate() 
     var postDate = NSDate(timeIntervalSince1970: phpTime as NSTimeInterval) 
     var postTimeOffset = currentDate.offsetFrom(postDate) as String 
     /*let url = NSURL(string: "http://bangedabigailtwice.tk/kno/getImage.php?id=\(imageID)") 
     var err: NSError? 
     var imageData :NSData = NSData(contentsOfURL: url!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)! 
     var imageFromURL = UIImage(data:imageData) 
     */ 
     self.personImage?.image = UIImage(named: imageName) 
     self.postTitle?.text = title 
     self.postText?.text = text 
     //self.postImage?.image = imageFromURL 
     self.postImage.userInteractionEnabled = true 
     self.postTime?.text = postTimeOffset 
     self.popularityOutlet?.text = popularity 
     let recognizer = UITapGestureRecognizer(target: self, action:Selector("tapImageView:")) 
     recognizer.numberOfTapsRequired = 2 
     postImage.addGestureRecognizer(recognizer); 
    } 

如果你看一下上面的代码,我已经注释掉导致性能问题的线路。现在对于我的问题,我如何临时存储图像供以后使用,以及如何在临时存储的图像存储后转储临时存储的图像?

+0

您可能会考虑在后台任务中预取图像。请参阅GDC例程(Grand Central Dispatch)。 – zisoft 2014-12-08 08:11:23

回答

1

线条

mainTableView.estimatedRowHeight = 50.0 
mainTableView.rowHeight = UITableViewAutomaticDimension 

被称为为表中的每一行。这只需要一次,所以你最好将它们移动到viewDidLoad

无需垂头丧气返回单元:

return cell as postWithTitleAndImageTableViewCell 

所以

return cell 

就足够了。

对于代码中的json部分,如果存在任何性能问题,则不可能看到此处。

+0

你的代码帮助,谢谢。此外,我还发现性能问题出现在我的setCell代码中,并且我有一个问题,请参阅我的更新问题。 – uhfocuz 2014-12-07 19:25:24