Когда я прокручиваю вверх & вниз, тогда ячейка 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 повторно использует свои ячейки. Если вы пролистаете прокрутку, ячейка, которая в последний раз удерживает экран, снова используется для той, которая отображается далее. Это хорошо, поскольку это позволяет избежать стабильной инициализации клеток. Если это лагги, это ваша вина. – shallowThought
Попробуйте 'DispatchGroup.main.async {self.tableView.reloadData()}' вместо 'self.tableView.reloadData()' – shallowThought
Привет, Sungwookbaek. Считаете ли вы, что вы добавили наблюдателя свойств didSet к свойствам, которые заполняют ваши ячейки? Вы можете вызвать reloadData() из наблюдателя свойств. Это немного громоздко, но это должно сработать. – MacUserT