2017-09-15 6 views
1

사용자가 게시물을 좋아할 수 있지만 사용자가 피드를 업데이트하지만 단순히 셀 수를 두 배로하는 콜렉션보기를 구현하려고했습니다. 사라져야 할 오래된 세포를 떠난다. 즉, 셀의 절반이 업데이트되고 나머지 절반은 이전 값입니다. 기본적으로 문제없이 현재 셀을 업데이트하는 방법을 알아낼 수 없습니다. 이상적으로 나는 사용자가 like 버튼을 누르기를 원합니다. 그 버튼은 "다른 것"으로 바뀌고 콜렉션 뷰에서 변경 될 포스트의 좋아하는 수만큼 돌아가는 것 외에는 아무 것도 일어나지 않을 것입니다. 내가 추천의 추천을UICollectionView 셀을 다시로드하지만 이전 셀을 다시로드하지 않습니다.

@IBAction func likeButton_tapped(_ sender: Any) { 
    self.likeButton.isEnabled = false 
    print(self.postKey) 
    print(self.liked) 

    //make it so liking or unliking adds or subtracts from the total number of likes on the post 
    if liked == "Yes" 
    { 
     self.databaseRef.child("likes").child((FIRAuth.auth()?.currentUser?.uid)!).child(self.postKey).removeValue() 

     let NewLikeNumber = likeNumber - 1 
     self.databaseRef.child("GroupPosts").child(self.groupName.text!).child(self.postKey).child("likes").setValue(NewLikeNumber) 
     print(NewLikeNumber) 
    } 
    else{ 
     self.databaseRef.child("likes").child((FIRAuth.auth()?.currentUser?.uid)!).child(self.postKey).setValue("") 

     let NewLikeNumber = likeNumber + 1 
     self.databaseRef.child("GroupPosts").child(self.groupName.text!).child(self.postKey).child("likes").setValue(NewLikeNumber) 
     print(NewLikeNumber) 
    } 

    self.likeButton.isEnabled = true 
} 
+0

컬렉션보기를 어디에서 새로 고치십니까? – ebby94

+0

@ ebby94 게시물이로드 된 기능의 끝에서 컬렉션보기를 다시로드합니다. 이 함수는 viewwill에서 호출됩니다. – dombad

답변

0

: 등 버튼을 누르면되는 기능에 대한 코드 여기

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = feedCollectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! MyGroupFeedCollectionViewCell 

    cell.postKey = feedArray[indexPath.row].postKey 

    //clears the cells first 
    cell.profileImage.image = nil 
    cell.usernameLabel.text = nil 
    cell.usernameLabel2.text = nil 
    cell.groupName.text = nil 
    cell.postImageView.image = nil 
    cell.postCaptionTextView.text = nil 
    cell.timeStamp.text = nil 

    //load profile picture 
    cell.profileImage.sd_setImage(with: URL(string: feedArray[indexPath.row].ProfilePic), placeholderImage: UIImage(named:"no profile picture.png")) 

    //load username 
    cell.usernameLabel.text = feedArray[indexPath.row].Username 
    cell.usernameLabel2.text = feedArray[indexPath.row].Username 

    //load groupName when in home feed 
    cell.groupName.text = feedArray[indexPath.row].GroupName 

    //load postImage 
    cell.postImageView.sd_setImage(with: URL(string: feedArray[indexPath.row].PostImage), placeholderImage: UIImage(named:"penguinPanorama")) 

    //load caption 
    cell.postCaptionTextView.text = feedArray[indexPath.row].caption 

    //load likes once likes are implemented 
    //checks if the user has liked the post or not 
    databaseRef.child("likes").child((FIRAuth.auth()?.currentUser?.uid)!).child(feedArray[indexPath.row].postKey).observe(.value, with: { (snapshot) in 
     if(snapshot.exists()) 
     { 
      cell.liked = "Yes" 
      cell.likeButton.setTitle("Unlike", for: .normal) 
     } 
     else{ 
      cell.liked = "No" 
      cell.likeButton.setTitle("Like", for: .normal) 
     } 
    }) 

됩니다 : 여기

컬렉션 뷰 셀을로드하기위한 코드입니다 Firebase 트랜잭션을 사용하면 같은 수의 동시 수정으로 인해 같은 카운트가 혼란 스러울 수 있습니다.

func likePost(_ post: Post, completion: @escaping() ->()) { 

    guard let currentUserId = Auth.auth().currentUser?.uid else { 
     return 
    } 

    databaseRef.child(likes).child(currentUserId).child(postKey).runTransactionBlock ({ (currentData: MutableData) -> TransactionResult in 

       if var data = currentData.value as? [String: Any] { 
        var count = data["likesCount"] as! Int 
        count += 1 
        data["likesCount"] = count 
        currentData.value = data 
        return TransactionResult.success(withValue: currentData) 
       } 

       return TransactionResult.success(withValue: currentData) 

    }, andCompletionBlock: { (error, success, snapshot) in 

       // ... 

    }) 

} 

물론 게시물을 올리지 못하는 사용자에게도 마찬가지입니다. 등의 버튼을 사용자 탭이하는 작업을 수행 할 때마다

private var isPostLiked = false 

그리고 : 이제

는 사용자가 게시물을 좋아 여부 로컬 등의 상태를 저장하는 클래스에 부울을 만들 수 있습니다, 알고 그런 간단한 검사 : 이제

 func handleLikeTapped() { 

      guard let post = post else { 
       return 
      } 

      if isPostLiked { 

       NetworkManager.shared.likePost(post, completion: { [weak self] in 

        // Once the completion handler of your method is called, the likes count in your database is now updated. 
        // To avoid making another read in the database just now, you can just 
        // Update your count (a label that shows how many likes a specific post received I guess ?) locally here so that the user can see in realtime the change (with animation or not depending on what you want to achieve) 

        // And finally update the like state of the post so that if the user click again on like it wouldn't mess everything up: 

        self?.isPostLiked = false 
       }) 

      } 

      else { 

       NetworkManager.shared.dislikePost(post, completion: { [weak self] in 

        // ... 
       }) 
      } 
    } 

은 물론 나중에 당신이 좋아하는 다른 뷰 컨트롤러에서 계산 액세스해야하는 경우, 당신은 당신의 데이터베이스에서 업데이트 된 likesCount를 얻을 수 observeSingleEvent(of: .value)을 사용합니다.

질문이 있으면 알려주세요.