: 등 버튼을 누르면되는 기능에 대한 코드 여기
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)
을 사용합니다.
질문이 있으면 알려주세요.
컬렉션보기를 어디에서 새로 고치십니까? – ebby94
@ ebby94 게시물이로드 된 기능의 끝에서 컬렉션보기를 다시로드합니다. 이 함수는 viewwill에서 호출됩니다. – dombad