【问题标题】:How do I update tableview cell when It had changed更改后如何更新表格视图单元格
【发布时间】:2023-03-19 06:44:01
【问题描述】:

当我上下滚动时,tableview 单元格设置了超时,因此会影响滞后。

我只想在数据更新时更新。

Post.swift(它是模型)

import Foundation
import Parse

class Post: PFObject, PFSubclassing {

    @NSManaged var postBy: PFUser?

    @NSManaged var postUser: String?
    @NSManaged var postUserImg: PFFile?



    @NSManaged var postText: String?
    @NSManaged var postImg: PFFile?
    @NSManaged var sell: NSNumber?

    @NSManaged var commentPointer: PFObject?
    @NSManaged var commentBy: String?
    @NSManaged var comment: String?

    @NSManaged var liked: NSArray?
    @NSManaged var likeCount: NSNumber?

    @NSManaged var mention: NSArray?
    @NSManaged var hashtag: NSArray?


    static func parseClassName() -> String {
        return "Post"
    }



    override class func query() -> PFQuery<PFObject>? {

        let query = PFQuery(className: Post.parseClassName())


        return query
    }

}

extension Post: FeedCellSupport {


    var username:String?{


        return postUser
    }

    var userImg:PFFile?{



        return postUserImg
    }

    var commentText:String?{

        guard let commentTxt = comment else {
            return ""
        }


        return commentTxt


    }

TableView.swift

protocol FeedCellSupport {
    var postDate: String? { get }
    var postId: String? { get }
    var postObj: PFObject? { get }
    var img: PFFile? { get }
    var username:String?{ get }
    var userImg:PFFile?{ get }

    var commentText:String?{ get }
    var commentFrom:String?{ get }

    var postText: String? { get }
    var likes: Int? { get }
    var isLiked: Bool? { get }
    var isSell: Bool? { get }

    var hashtags: NSArray? { get }
    var mentions: NSArray? { get }

}


func fetchObjects() {

        let postQuery = Post.query()?
                        .whereKeyExists("objectId")
                        .includeKeys(["postBy", "commentPointer", "commentPointer.commentBy", "commentBy"])
                        .order(byDescending: "createdAt")
                        as! PFQuery<Post>

        postQuery.limit = self.page
        postQuery.cachePolicy = .networkElseCache

        postQuery.findObjectsInBackground { (object:[Post]?, error:Error?) in

            if error == nil {

                self.results = object!

            }else {
                print(error?.localizedDescription as Any)
            }

            self.tableView.reloadData()
            self.refresher.endRefreshing()
        }


    }


 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ShopDetailCell", for: indexPath) as! ShopDetailCell

        if let object = results[indexPath.row] as? FeedCellSupport{




            cell.postID = object.postObj!
            cell.userNameLabel.text = object.username!
            cell.userNameLabel.sizeToFit()

            cell.descriptionLabel.text = object.postText!
            cell.descriptionLabel.sizeToFit()

            cell.commentByLabel.text = object.commentFrom!
            cell.commentByLabel.sizeToFit()

            cell.commentLabel.text = object.commentText!
            cell.commentLabel.sizeToFit()
 cell.delegate = self

        }
        return cell
    }

如何确保数据仅在数据发生变化时才更新?

【问题讨论】:

  • 这是不可能的,好吧,不是故意的。 tableView 重用了它的单元格。如果您滚动,最后一个显示在屏幕上的单元格将再次用于下一个显示的单元格。这很好,因为它避免了单元的稳定初始化。如果它滞后,那是你的错。
  • 试试DispatchGroup.main.async { self.tableView.reloadData() }而不是self.tableView.reloadData()
  • 嗨 Sungwookbaek,您是否考虑过为填充单元格的属性添加 didSet 属性观察器?您可以从属性观察者调用 reloadData()。这有点麻烦,但应该可以。
  • @shallowThought 感谢您的回复。我试过 DispatchGroup.main.async 但仍然滞后。我正在尝试初始化单元格。谢谢
  • @MacUserT 谢谢我还没试过。我会尝试didSet。感谢回复

标签: swift uitableview parse-platform parse-server


【解决方案1】:

您的应用程序有哪些功能?您的问题与适合完成任务的方式有关,即:更新应用内容。

所以它是关于业务逻辑的:什么时候应该更新信息?

您的问题的解决方案是使用用户切换事件来刷新内容或其他可能的解决方案,例如 Application Delegate

除了这些答案,内容无法按照您的期望自动更新tableview。

更新

我认为这行代码是滞后的:

if let object = results[indexPath.row] as? FeedCellSupport{
    //other code
}

因为这些大括号内的代码正在处理数据设置。您可以尝试模拟本地数据而不是这个 results 数组来说明这是否是问题所在。

【讨论】:

  • 我正在使用解析服务器。因此,当数据被更改或创建时,调用事件处理程序来更新我的 tableview 的单元格。那没问题。我的问题是当我向上和向下滚动时,这个函数“override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {” 每次都会调用并设置数据。所以我觉得迟钝。
  • @sungwookbaek 也许这条线出了点问题code if let object = results[indexPath.row] as? FeedCellSupport code
  • @sungwookbaek 我根据你的解释更新了我的答案。抱歉之前评论的格式不正确,因为我是评论系统的新手。如果你愿意,你可以删除它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多