我有一个允许用户发布帖子的应用。我注意到,当用户制作post
时,帖子已正确添加到他们的posts
中。但是,当该用户注销并且我登录其他用户时,会将post
附加到新登录用户的posts
上。因此,同一帖子出现在两个用户的posts
上。我无法弄清楚这是怎么回事。我尝试使用断点,但是我什至找不到代码可能在哪里执行此操作。添加帖子的代码是:
@IBAction func postButtonTapped(_ sender: Any) {
guard let beverageNameAdd = beverageName.text, beverageNameAdd != "" else {
print("ERIC: Caption must be entered")
return
}
if bevCat == "Wine" {
guard let wineVintageAdd = wineVintage.text, wineVintageAdd != "" else {
print("ERIC: Vintage must be entered")
return
}
self.wineCount = self.wineCount + 1
db.collection("users").document(uid!).setData([ "wineCount": self.wineCount!], merge: true)
}
if bevCat == "Beer" {
self.beerCount = self.beerCount + 1
db.collection("users").document(uid!).setData([ "beerCount": self.beerCount!], merge: true)
}
if bevCat == "Liquor" {
self.liquorCount = self.liquorCount + 1
db.collection("users").document(uid!).setData([ "liquorCount": self.liquorCount!], merge: true)
}
guard let beverageTypeAdd = beverageType.text, beverageTypeAdd != "" else {
print("ERIC: Vintage must be entered")
return
}
guard let img = newPostImage.image, imageSelected == true else {
print("ERIC: An image must be selected")
return
}
if let imageData = img.jpegData(compressionQuality: 0.2) {
let imgUid = NSUUID().uuidString
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
let storageItem = STORAGE_BASE.child(imgUid)
print("STORAGE ID: \(storageItem)")
DataService.ds.REF_POST_IMAGES.child(imgUid).putData(imageData, metadata: metadata) { (metadata, error) in
if error != nil {
print("ERIC: Unable to upload image to Firebasee torage")
} else {
print("ERIC: Successfully uploaded image to Firebase storage")
DataService.ds.REF_POST_IMAGES.child(imgUid).downloadURL(completion: { (url, error) in
if error != nil {
print("ERROR in image \(error!)")
print("Error URL for image: \(String(describing: url))")
return
}
if url != nil {
self.postToFirebase(imgUrl: url!.absoluteString)
print("URL for image: \(String(describing: url))")
}
})
}
}
}
performSegue(withIdentifier: "reloadFeed", sender: self)
}
func postToFirebase(imgUrl: String) {
let post: Dictionary<String, AnyObject> = [
//"postTimeStamp": [".sv" : "timestamp"] as AnyObject,
"beverageName": beverageName.text! as AnyObject,
"imageUrl": imgUrl as AnyObject,
"beverageType": beverageType.text! as AnyObject,
"wineVintage": wineVintage.text! as AnyObject,
"beverageRating": beverageRating.rating as AnyObject,
"beveragePrice": beveragePrice.text! as AnyObject,
"beverageCategory": bevCat as AnyObject,
"uid": uid as AnyObject
]
let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
firebasePost.setValue(post)
let userPost = firebasePost.key
print("Firebase Post: \(String(describing: firebasePost))")
let followerList = DataService.ds.REF_USERS.child("\(uid!)").child("followers")
followerList.observe(.value, with: { (snapshot) in
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
print("SNAP -- \(snap.key)")
DataService.ds.REF_TIMELINE.child("\(snap.key)").child("\(userPost!)").setValue(true)
}
}
})
print("ADDING POST \(userPost!)")
_ = Auth.auth().addStateDidChangeListener { (auth,user) in
if let user = user {
let userId = user.uid
print("USER: \(String(describing: userId))")
let newPost = DataService.ds.REF_USERS.child("\(userId)").child("posts").child(userPost!)
newPost.setValue(true)
}
}
beverageName.text = ""
beverageType.text = ""
beveragePrice.text = ""
imageSelected = false
newPostImage.image = UIImage(named: "icons8-camera-100")
}
然后,退出代码在此处:
@IBAction func logoutTapped(_ sender: Any) {
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
let _: Bool = KeychainWrapper.standard.removeObject(forKey: KEY_UID)
performSegue(withIdentifier: "signOut", sender: self)
}
catch let signOutError as NSError {
print ("Error signing out: %@", signOutError)
}
}
然后在此处登录的代码:
@IBAction func loginPressed(_ sender: UIButton) {
if let email = emailInput.text, let pwd = passwordInput.text {
Auth.auth().signIn(withEmail: email, password: pwd) { [weak self] user, error in
guard self != nil else { return }
if let user = user {
let uid = user.user.uid
let userData = ["provider": user.user.providerID]
self!.completeSignIn(id: uid, userData: userData)
} else {
let alert = UIAlertController(title: "Email/Password Incorrect", message: "The username/password combination is incorrect. Try again.", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Okay", style: UIAlertAction.Style.default, handler: nil))
self!.present(alert, animated: true, completion: nil)
}
}
}
}
我知道可能需要更多诊断该问题,但根据Firebase实时数据库,在我看来,新用户登录后会立即附加旧用户的帖子。是否有人以前或之前曾见过此类行为?知道如何开始调试吗?
答案 0 :(得分:0)
@Jay指出的问题在于
_ = Auth.auth().addStateDidChangeListener { (auth,user) in
if let user = user {
let userId = user.uid
print("USER: \(String(describing: userId))")
let newPost = DataService.ds.REF_USERS.child("\(userId)").child("posts").child(userPost!)
newPost.setValue(true)
}
}
只要身份验证发生任何变化,我都会将帖子添加到用户的帖子中,这毫无意义。我只需要在用户按添加帖子时添加帖子。我删除了所有代码,除了:
let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts").child(userPost!)
newPost.setValue(true)