2017-03-12 4 views
5

Ich habe ein Tutorial über die Erstellung einer Instragram-esque App verfolgt, und ich habe viel Mühe herauszufinden, wie man einen Beitrag löschen, sowohl von Firebase und von das Futter. Das Bild, das der Benutzer auswählt, oder nimmt mit dieser Funktion auf Firebase Datenbank hochgeladen:Wie lösche ich ein Kind aus Firebase (Swift)

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() 
} 

, die in Firebase endet wie folgt aussehen:

enter image description here

einem Stapelüberlauf Antwort Im Anschluss fand ich, Ich habe versucht, eine Löschfunktion einzurichten, die beim Drücken der Löschtaste aufgerufen wird. Diese Löschschaltfläche befindet sich in einer "Fotodetail" -Ansicht, auf die der Benutzer durch Tippen auf ein Bild im Bildvorschub gelangt. In dieser Fotodetailansicht wird das Bild in größerem Format angezeigt, zusammen mit einigen anderen Informationen wie etwa:

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)") 
     } 
    } 
} 

und rufen Sie die Funktion hier:

@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) 
} 

ich bin nicht wirklich verstehen, was ich aber tue, und es ist unnötig zu sagen, die Löschtaste tippen tut im Grunde nichts. Kann jemand mir zeigen, wie man die Löschungfunktion repariert, also kann ich ein Bild/einen Pfosten von der Firebase richtig entfernen?

EDIT: Ich habe var selectedPost: Post! in meinem PhotoDetailController, die aus dem FeedViewController (Bild Feed) in didSelectItem wie so übergeben wird:

es
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) 
} 

So den Indexpfad hat. Ein weiterer Hinweis zu der obigen Funktion ist, dass var posts = [Post]() in der FeedViewController instanziiert wird, so dass posts[indexPath.row] stammt.

+0

Haben Sie ein Post-Objekt in Ihrem DetailView mit den Informationen des aktuellen Posts in der Detailansicht? Oder irgendein Objekt, das die Informationen des Posts enthält (wie die ID)? –

+0

Hey Pieter Ja, ich habe eine Variable, die das Post-Objekt und den Index-Pfad des ausgewählten Bildes aus dem Feed enthält - check my edit, ich lege den Code dort, um es klarer zu machen. – KingTim

Antwort

4

Dies sollte funktionieren.

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 
    } 
    } 
} 

erzeugt auch .childByAutoId().key eine Schlüsselpositionen in der DB einzufügen. Sie können es nicht verwenden, erhalten Sie einen Verweis auf ein vorhandenes Element.

+0

Vielen Dank! Es hat perfekt funktioniert. Wenn ich meinen Code ansehe, ist das tatsächlich einfacher geworden, als ich gedacht habe. Ich bin damit fertig geworden, herauszufinden, wie ich die childByAutoID verwenden kann. Danke nochmal sehr geschätzt! – KingTim

Verwandte Themen