2016-12-10 6 views
0

Когда я прокручиваю вверх & вниз, тогда ячейка 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 
    } 

Как я могу гарантировать, что данные обновляются только тогда, когда она меняется?

+0

Это невозможно, ну, не предназначено. TableView повторно использует свои ячейки. Если вы пролистаете прокрутку, ячейка, которая в последний раз удерживает экран, снова используется для той, которая отображается далее. Это хорошо, поскольку это позволяет избежать стабильной инициализации клеток. Если это лагги, это ваша вина. – shallowThought

+0

Попробуйте 'DispatchGroup.main.async {self.tableView.reloadData()}' вместо 'self.tableView.reloadData()' – shallowThought

+0

Привет, Sungwookbaek. Считаете ли вы, что вы добавили наблюдателя свойств didSet к свойствам, которые заполняют ваши ячейки? Вы можете вызвать reloadData() из наблюдателя свойств. Это немного громоздко, но это должно сработать. – MacUserT

ответ

0

Каковы ваши функциональные возможности приложения? Ваша проблема связана с тем, как подходит для выполнения вашей задачи, а именно: для обновления содержимого приложения.

Значит, деловая логика: когда следует обновлять информацию?

Решение вашей проблемы с помощью пользователей переключены событиями, чтобы обновить содержимое или другие возможные решения, такие как Application делегат.

этих ответов за исключением, содержание не обновления Tableview может автоматически, как ваши ожидания.

Update

Я считал, эта строка кода запаздывает:

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

Поскольку код внутри этих скобок имеет дело с установкой данных. Вы можете попытаться объединить локальные данные вместо этого массива results, чтобы сказать, является ли это проблемой.

+0

Я использую синтаксический анализатор. Поэтому, когда данные были изменены или созданы, он вызвал обработчик событий, чтобы обновить ячейку tableview. Это не проблема. Моя проблема заключается в том, когда я просматриваю вверх и вниз, тогда эта функция «переопределяет func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {« вызывается и устанавливает данные каждый раз. Поэтому я чувствую себя лагги. –

+0

@sungwookbaek Возможно, что-то пойдет не так с этой строкой 'code', если let object = results [indexPath.row] as? FeedCellSupport 'code' –

+0

@sungwookbaek Я обновил свой ответ в соответствии с вашим объяснением. Извините за плохое форматирование прежнего комментария, потому что я новичок в системе комментариев. Вы можете удалить его, если хотите. –

Смежные вопросы