&をスクロールすると、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
'self.tableView.reloadData()'の代わりに 'DispatchGroup.main.async {self.tableView.reloadData()}'を試してください – shallowThought
こんにちは、ソンウォクバックは、あなたの細胞を埋めるプロパティにdidSetプロパティオブザーバを追加することを考えましたか?プロパティオブザーバからreloadData()を呼び出すことができます。ちょっと面倒ですが、うまくいくはずです。 – MacUserT