【发布时间】: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