ios – 如何从Firebase中删除孩子(Swift)

我一直在关注制作一个instragram-esque应用程序的教程,我在查找如何从Firebase和feed中删除帖子时遇到了很多麻烦.使用此功能将用户选择或拍摄的图像上传到Firebase数据库:
func uploadToFirebase() {
    AppDelegate.instance().showActivityIndicator()

    let uid = FIRAuth.auth()!.currentUser!.uid
    let ref = FIRDatabase.database().reference()
    let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com")

    let key = ref.child("posts").childByAutoId().key
    let imageRef = storage.child("posts").child(uid).child("\(key).jpg")

    let data = UIImageJPEGRepresentation(self.previewImage.image!,0.6)

    let uploadTask = imageRef.put(data!,metadata: nil) { (metadata,error) in

        if error != nil {
            print(error!.localizedDescription)
            AppDelegate.instance().dismissActivityIndicator()
            return
        }

        imageRef.downloadURL(completion: { (url,error) in

            if let url = url {
                // how do I add date: NSDate in here?
                let feed = ["userID" : uid,"pathToImage" : url.absoluteString,"likes" : 0,"author" : FIRAuth.auth()!.currentUser!.displayName!,"postID" : key] as [String : Any]

                let postFeed = ["\(key)" : feed]

                ref.child("posts").updateChildValues(postFeed)
                AppDelegate.instance().dismissActivityIndicator()

                self.dismiss(animated: true,completion: nil)
            }
        })
    }
    uploadTask.resume()
}

最终在Firebase中看起来像这样:

在我发现堆栈溢出答案之后,我尝试设置一个删除按钮时按下删除按钮的功能.此删除按钮位于“照片详细信息”视图中,用户通过点击图像Feed中的图像来访问该视图 – 此照片详细信息视图以更大的尺寸显示图像,以及其他一些信息,例如:

func deletePost(firstTree: String,childIWantToRemove: String) {

    let uid = FIRAuth.auth()!.currentUser!.uid
    let ref = FIRDatabase.database().reference()
    let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com")

    let key = ref.child("posts").childByAutoId().key
    let imageRef = storage.child("posts").child(uid).child("\(key).jpg")

    ref.child("posts").child(key).child("postID").removeValue { (error,ref) in
        if error != nil {
            print("error \(error)")
        }
    }
}

并在这里调用函数:

@IBAction func moreButtonPressed(_ sender: AnyObject) {

    let alertController = UIAlertController(title: nil,message: nil,preferredStyle: .actionSheet)
    let cancelAction = UIAlertAction(title: "Cancel",style: .cancel)
    let destroyAction = UIAlertAction(title: "Delete",style: .destructive) { action in
        print(action)

        let ref = FIRDatabase.database().reference()
        let key = ref.child("posts").childByAutoId().key

        let firstTree = key
        let valueToRemove = "postID"
        self.deletePost(firstTree: firstTree,childIWantToRemove: valueToRemove)
    }

    alertController.addAction(destroyAction)
    alertController.addAction(cancelAction)
    self.present(alertController,animated: true)
}

我不是真的在理解我在做什么,不用说点击删除按钮基本上没什么.任何人都可以告诉我如何修复删除功能,以便我可以正确删除firebase中的图像/帖子?

编辑:我有var selectedPost:发布!在我的PhotoDetailController中,它从didSelectItem中的FeedViewController(图像提要)传递,如下所示:

func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
    let photoDetailController = self.storyboard?.instantiateViewController(withIdentifier: "photoDetail") as! PhotoDetailController

    photoDetailController.selectedPost = posts[indexPath.row]

    present(photoDetailController,animated: true,completion: nil)
}

所以它有索引路径.关于上述函数的另一个注意事项是var posts = [Post]()在FeedViewController中实例化,因此post [indexPath.row]来自.

解决方法

这应该工作.
func deletePost() {
  let uid = FIRAuth.auth()!.currentUser!.uid
  let storage = FIRStorage.storage().reference(forURL: "gs://cloudcamerattt.appspot.com")

  // Remove the post from the DB
  ref.child("posts").child(selectedPost.postID).removeValue { error in
    if error != nil {
        print("error \(error)")
    }
  }
  // Remove the image from storage
  let imageRef = storage.child("posts").child(uid).child("\(selectedPost.postID).jpg")
  imageRef.delete { error in
    if let error = error {
      // Uh-oh,an error occurred!
    } else {
     // File deleted successfully
    }
  }
}

另外.childByAutoId().key生成一个键,用于将项目插入数据库.您无法使用它获取对现有项目的引用.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...