【发布时间】:2022-01-21 20:10:25
【问题描述】:
我正在从 Firestore 获取帖子数据并在 tableview 中显示。我正在尝试实现关注功能,并且在获取以下帖子数据的数据后会重复。
getPostData(name:String,uid:String,img:String,followingId:String)该函数用于从firebase获取post数据
var postArray = [postData]()
func getPostData(name:String,uid:String,img:String,followingId:String) {
FirebaseReference(.Post).getDocuments{(snapshot, error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc = snapshot, doc.isEmpty == false {
print("Post Document is present.")
let desc = doc.documents
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
self.postArray.removeAll()
for item in desc
{
let post = item.data()
let puid = item.documentID
let title = post["title"] as! String
let audioDuration = post["audioDuration"] as! String
let audioUrl = post["audioUrl"] as! String
let date = post["date"] as! String
let postId = post["postId"] as! String
let userId = post["userId"] as! String
let emoji = post["emoji"] ?? ""
let feeling = post["feeling"] ?? ""
FirebaseReference(.Post).document(puid).collection("Like").getDocuments{(snapshot1,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc1 = snapshot1, doc1.isEmpty == false
{
let likecount = snapshot1?.count ?? 0
let desc1 = doc1.documents
var likeByUserId : String?
var likeId : String?
for item in desc1 {
likeByUserId = item["likedCommentToUserId"] as? String
likeId = item["likeCommentByUserId"] as? String
}
FirebaseReference(.Post).document(puid).collection("Comment").getDocuments{(snapshot2,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc2 = snapshot2, doc2.isEmpty == false
{
let commentCount = snapshot2?.count ?? 0
FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc3 = snapshot3, doc3.isEmpty == false
{
let reportCount = snapshot3?.count ?? 0
let desc2 = doc3.documents
var reportByUserId : String?
for item in desc2 {
reportByUserId = item["userId"] as? String
}
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: commentCount, reportCount: reportCount, img: img, likedByUserId:likeByUserId, likedId: likeId, reportByUserId: reportByUserId,followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
else
{
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: commentCount,reportCount: 0, img: img, likedByUserId:likeByUserId, likedId: likeId, reportByUserId: "NA",followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
}
}
}
else
{
FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc3 = snapshot3, doc3.isEmpty == false
{
let reportCount = snapshot3?.count ?? 0
let desc2 = doc3.documents
var reportByUserId : String?
for item in desc2 {
reportByUserId = item["userId"] as? String
}
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: 0,reportCount: reportCount, img: img, likedByUserId: likeByUserId, likedId: likeId, reportByUserId: reportByUserId,followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
else
{
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: 0,reportCount: 0, img: img, likedByUserId: likeByUserId, likedId: likeId, reportByUserId: "NA",followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
}
}
}
}
}
}
else
{
FirebaseReference(.Post).document(puid).collection("Comment").getDocuments{(snapshot,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc2 = snapshot, doc2.isEmpty == false
{
let commentCount = snapshot?.count ?? 0
FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc3 = snapshot3, doc3.isEmpty == false
{
let reportCount = snapshot3?.count ?? 0
let desc2 = doc3.documents
var reportByUserId : String?
for item in desc2 {
reportByUserId = item["userId"] as? String
}
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: commentCount,reportCount: reportCount, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: reportByUserId,followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
else
{
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: commentCount,reportCount: 0, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: "NA",followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
}
}
}
else
{
FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc3 = snapshot3, doc3.isEmpty == false
{
let reportCount = snapshot3?.count ?? 0
let desc2 = doc3.documents
var reportByUserId : String?
for item in desc2 {
reportByUserId = item["userId"] as? String
}
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: 0,reportCount: reportCount, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: reportByUserId,followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
else
{
if userId == uid
{
let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: 0,reportCount: 0, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: "NA",followingId: followingId)
self.postArray.append(object)
self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
self.voicebookTableView.reloadData()
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
有从Firestore用户集合获取的参数名称、uid、img和followingId 使用此方法 getUsersDataFromFirebase()
func getUsersDataFromFirebase()
{
FirebaseReference(.Users).getDocuments{(snapshot, error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc = snapshot, doc.isEmpty == false {
print("User Document is present.")
let desc = doc.documents
self.postArray.removeAll()
for item in desc
{
let user = item.data()
let name = user["name"] as! String
let uid = user["userID"] as! String
let img = user["imgUrl"] as? String
let date = user["date"] as! String
let gender = user["gender"] as? String
let location = user["location"] as! String
FirebaseReference(.Users).document(FUser.currentUser()?.userID ?? "").collection("Following").getDocuments{(snapshot1,error) in
if error != nil {
print("Document Error: ", error!)
} else {
if let doc1 = snapshot1, doc1.isEmpty == false {
let data = doc1.documents
var followingid = ""
self.postArray.removeAll()
for newitem in data
{
let value = newitem.data()
followingid = value["followedToUserId"] as? String ?? ""
self.getPostData(name: name, uid: uid, img: img ?? "",followingId: followingid )
}
}
else
{
self.getPostData(name: name, uid: uid, img: img ?? "",followingId:"NA")
}
}
}
if uid == FUser.currentUser()?.userID
{
let user1 = FUser(date: date, gender: gender ?? "",imgUrl: img ?? "",location: location, name: name, status: true, userID:"\(Auth.auth().currentUser?.uid ?? "")")
user1.saveUserLocally()
let pimg = URL(string: img ?? "")
self.profileImage.sd_setImage(with: pimg, placeholderImage: UIImage(named: "demouser.png"))
}
}
}
else
{
print("User Document is not present.")
}
}
}
}
Im getting output like in image
我已经尝试了很多次,但我的数据仍然重复,我不知道我在哪里做错了请有人帮我解决这个问题。
谢谢
【问题讨论】:
-
我已经尝试过了,但它不起作用
-
@AryanVishwakarma 你用 Set 试过了吗?如果您尝试过但仍然面临问题,那么数组中的每个对象都是不同的。即对象的任何属性都与其他属性不同
-
我使用 struct 和 Set 不起作用,我应该在哪里写 Set 因为我在不同的不同条件下附加数据@Rahul Phate
标签: ios arrays swift uitableview google-cloud-firestore