2017-03-12 11 views
5

से एक बच्चे को कैसे हटाएं I Instagram-esque ऐप बनाने के लिए एक ट्यूटोरियल का पालन कर रहा हूं, और मुझे फायरबेस और दोनों से एक पोस्ट को हटाने का तरीका समझने में बहुत परेशानी हो रही है भोजन। छवि उपयोगकर्ता का चयन करता है या ले जाता है कि इस समारोह के साथ 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 में समाप्त होता है इस तरह लग रही:

enter image description here

एक ढेर अतिप्रवाह जवाब मैंने पाया के बाद, मैंने डिलीट बटन दबाए जाने पर कॉल करने के लिए एक डिलीट फ़ंक्शन सेट अप करने का प्रयास किया। यह डिलीट बटन "फोटो विवरण" दृश्य पर है, जिसे उपयोगकर्ता छवि फ़ीड में एक छवि टैप करके प्राप्त करता है - यह फोटो विवरण दृश्य छवि को किसी अन्य जानकारी के साथ प्रदर्शित करता है जैसे कि पसंद:

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

मैं सच में नहीं समझ रहा हूँ मैं हालांकि क्या कर रहा है, और हटाएँ बटन दोहन अनिवार्य रूप से कुछ नहीं करता है कहने की। क्या कोई मुझे दिखा सकता है कि डिलीट फ़ंक्शन को कैसे ठीक किया जाए ताकि मैं एक छवि/पोस्ट को फायरबेस से ठीक से हटा सकूं?

संपादित करें:

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

तो यह सूचकांक पथ है: मैं अपने PhotoDetailController है, जो इतनी तरह didSelectItem में FeedViewController (चित्र फ़ीड) से पारित हो जाता है में var selectedPost: Post! है। उपरोक्त फ़ंक्शन के बारे में एक और नोट यह है कि var posts = [Post]() को FeedViewController में तत्काल किया गया है, इसलिए वह है जहां posts[indexPath.row] आता है।

+0

क्या आपके पास अपने विवरण में कोई पोस्ट ऑब्जेक्ट है, वर्तमान दृश्य की जानकारी के साथ विस्तार दृश्य में देखें? या कोई ऑब्जेक्ट जिसमें पोस्ट की जानकारी शामिल है (जैसे आईडी)? –

+0

हे पीटर हां मेरे पास एक वेरिएबल है जिसमें पोस्ट ऑब्जेक्ट और फ़ीड से चयनित छवि का इंडेक्स पथ है - मेरा संपादन जांचें, मैंने कोड को स्पष्ट करने के लिए वहां रखा है। – KingTim

उत्तर

4

यह काम करना चाहिए।

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 डीबी में आइटम डालने के लिए एक महत्वपूर्ण उत्पन्न करता है। आप इसका उपयोग किसी मौजूदा आइटम का संदर्भ प्राप्त नहीं कर सकते हैं।

+0

आपको बहुत बहुत धन्यवाद! यह पूरी तरह से काम किया। अपने कोड को देखते हुए, यह वास्तव में मेरे विचार से अधिक सरल होने के बाद समाप्त हुआ, मैं बच्चे ByAutoID का उपयोग करने के तरीके को समझने की कोशिश में लपेट रहा था। धन्यवाद फिर से सराहना की! – KingTim