2017-10-23 1 views
1

現在、firebaseを持つ特定のユーザーの全フォロワーを取得しようとしています。私didSet節では、私は、現在のユーザが次のことをユーザーにフェッチし、テキストフィールドに割り当てる)(関数setFollowingCountを呼び出す:FirebaseとSwiftを使用してフォロワーを獲得してすぐにカウントする方法

var user: User? { 
    didSet { 

     setFollowingCount() 
     guard let following = self.user?.following else {return} 
     let attributedText = NSMutableAttributedString(string: "\(following)\n", attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 14)]) 

     attributedText.append(NSAttributedString(string: "followers", attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)])) 

     self.followingLabel.attributedText = attributedText 

    } 
} 

setFollowingCount()関数は次のとおりです。

func setFollowingCount(){ 
    var i = 0 
    guard let userId = self.user?.uid else { return } 
    Database.database().reference().child("following").child(userId).observe(.value) { (snapshot) in 
      self.user?.following = Int(snapshot.childrenCount) 
    } 

} 

問題は、読み込みに非常に時間がかかり、ユーザーのプロフィールを見るときにアプリ全体がフリーズすることが多いということです。これをスピードアップしたり、より効率的に動作させるにはどうしたらいいですか?

答えて

0
self.user?.following = Int(snapshot.childrenCount) 

効率的な解決策ではありません。 .childrenCountは実際にスナップショットをループし、遅くなるすべての子を数えます。

代わりに、フォロワーの数を1つの値として保存したい場合は、より速く取り出すことができます。

following: { 
    uid: { 
     followingCount: 100, 
     follwersCount: 150 
    } 
} 

次に、あなたは次のように問い合わせることができます:

Database.database().reference().child("following").child(userId).observeSingleEvent(of: .value) { (snapshot) in 
     if let counts = snap.value as? [String: AnyObject] } 
      let followingCount = counts["followingCount"] as? Int 
      let followersCount = counts["followersCount"] as? Int 

      // save these values somewhere 
     }  
    }) 

私はまた、あなたがカウントがめちゃくちゃされませんので、フォロワーがトランザクションブロック内でカウント/デクリメントをインクリメントすることをお勧めします。あなたが参照を削除する必要が.observeを使用するつもりなら

static func incrementCount(countName: String) { 
    if let uid = Auth.auth().currentUser?.uid { 
     let databaseReference = Database.database().reference() 
     databaseReference.child("following").child(uid).runTransactionBlock { (currentData: MutableData) -> TransactionResult in 
      if var data = currentData.value as? [String: Any] { 
       var count = data[countName] as! Int 
       count += 1 
       data[countName] = count 
       currentData.value = data 
       return TransactionResult.success(withValue: currentData) 
      } 
     return TransactionResult.success(withValue: currentData) 
     } 
    }   
} 

最後に、 :それはこのような何かを見ることができます。この場合、アップデートを探しているわけではありませんので、.observeSingleEvent

関連する問題