Swift - 在使用正确数据更新之前,单元格显示错误数据

时间:2016-01-10 23:57:59

标签: ios swift uitableview

单元格中的每个单元格都会加载和映像以及来自parse.com的一些文本 但是当我滚动它时,在加载的图像和错误的用户名之前显示错误的图像。 timeago和消息正常工作。

我已经阅读了有关prepareForReuse()方法的内容,但它无效。

有什么想法吗?

的UITableViewController:

   let cell = tableView.dequeueReusableCellWithIdentifier("chatcell", forIndexPath: indexPath) as? PTATableViewCell
      cell.delegate = self



        cell.setPanGesture(.LeftToRight, mode: .Exit, color: UIColor.whiteColor(), view: viewWithImage(named: "infostart"))

        cell.leftToRightAttr.triggerPercentage = 0.4
        cell.leftToRightAttr.rubberbandBounce = false
        cell.leftToRightAttr.viewBehavior = .DragWithPan


        let targetObject = rooms[indexPath.row] as PFObject
        let targetUser = users[indexPath.row] as PFUser

        let mm = rooms[indexPath.row]
        cell.mesaj.text = mm.objectForKey("Message") as! String
        cell.timeAgo.text = "\(targetObject.updatedAt!.formattedAsTimeAgo())"

    let userget = PFUser.query()
        userget!.whereKey("objectId", equalTo: targetUser.objectId!)
        userget!.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
            if error == nil {
                if let fUser = objects!.last as? PFUser {
                    let namee = fUser.objectForKey("name") as! String
                    let agee = fUser.objectForKey("age") as! Int
                    cell.nameUser.text = "\(namee), \(agee)"
                    if let pica = fUser.objectForKey("dpSmall") as? PFFile {
                        pica.getDataInBackgroundWithBlock({ (data:NSData?, error:NSError?) -> Void in
                            if error == nil {
                                cell.userdp.image = UIImage(data: data!)
                                cell.userdp.layer.borderColor = colorText.CGColor
                                circleBorder(cell.userdp)
                            }
                        })

Customviewcell:

public override func prepareForReuse() {
    super.prepareForReuse()
    nameUser.text = "Loading..."
    userdp.image = nil
    timeAgo.text = nil
    mesaj.text = nil
    likedtext.text = nil
    removeSwipingView()
    stateOptions = .None
    leftToRightAttr = PTATableViewItemStateAttributes()
    rightToLeftAttr = PTATableViewItemStateAttributes()
}

2 个答案:

答案 0 :(得分:0)

表视图中的单元格被重用。由于您在后台获取新图像和用户名,因此将显示该单元的先前内容(正在重复使用),直到获取并替换新内容为止。注意消息和时间是如何同步在单元格上设置的(在这种情况下,不在findObjectsInBackgroundWithBlock回调中),这就是它工作的原因。

答案 1 :(得分:0)

似乎PFQuery有一种取消操作的方法。 https://parse.com/docs/ios/api/Classes/PFQuery.html#/c:objc(cs)PFQuery(im)cancel

试试这个。 将查询定义为PTATableViewCell的属性

let userget = PFQuery?

并在做另一个之前取消操作。这样的事情:

if cell.userget != nil {
    cell.userget.cancel()
}
cell.userget = PFUser.query()
cell.userget!.whereKey("objectId", equalTo: targetUser.objectId!)
...