2016-12-10 8 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

'self.tableView.reloadData()'の代わりに 'DispatchGroup.main.async {self.tableView.reloadData()}'を試してください – shallowThought

+0

こんにちは、ソンウォクバックは、あなたの細胞を埋めるプロパティにdidSetプロパティオブザーバを追加することを考えましたか?プロパティオブザーバからreloadData()を呼び出すことができます。ちょっと面倒ですが、うまくいくはずです。 – MacUserT

答えて

0

あなたのアプリの機能は何ですか?あなたの問題は、あなたの仕事を達成するのに適した方法、すなわちアプリの内容を更新することに関連しています。

ビジネスロジックについて:情報をいつ更新する必要がありますか?

あなたの問題を解決するには、内容や、そのようなアプリケーションデリゲートなどの他の可能な解決策をリフレッシュするためにユーザー切り替えイベントを使用しています。

これらの回答以外はと一致しません。テーブルビューは自動的にとなります。

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

はこれらの中括弧内のコードは、データ設定を扱っているので:

更新

私はこのコード行が遅れていると考えます。このresults配列の代わりにローカルデータをモックアップして、これが問題かどうかを判断することができます。

+0

私は解析サーバを使用しています。したがって、データが変更または作成された後、イベントハンドラが呼び出され、テーブルビューのセルが更新されます。問題ない。私の問題は、私が上下にスクロールし、この関数 "オーバーライドfunc tableView(_ tableView:UITableView、cellForRowAt indexPath:IndexPath) - > UITableViewCell {"と毎回データを設定するときです。だから私は遅れを感じる。 –

+0

@sungwookbaekもしlet object = results [indexPath.row]とすれば、この行の 'code'に何か問題があるかもしれません。 FeedCellSupport 'code' –

+0

@スンウォクベク私はあなたの説明に従って答えを更新しました。私はシステムをコメントするのが新しいので、元のコメントのフォーマットが悪いため申し訳ありません。あなたがしたい場合は、それを削除することができます。 –

関連する問題