2017-05-09 6 views
0

私はイベントアプリケーションにしようとしています。 Firebaseデータベースにイベントを追加して取得することができます。私がviewControllerから追加ボタンをクリックすると、イベントの情報がFirebaseデータベースに追加されます。しかし、私はログアウトして再度ログインするまで、私のtableViewControllerに表示することはできません。私は、ログイン時にのみ、どのように私はfirebaseデータベースを確認することができますし、ときにそれらを取得別のViewControllerのチェックボタン

import UIKit 
import os.log 
import Firebase 
class UploadPost: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var eventImage: UIImageView! 
    @IBOutlet weak var selectImageBtn: UIButton! 

    @IBOutlet weak var eventName: UITextField! 
    @IBOutlet weak var eventInf: UITextView! 

    @IBOutlet weak var addBtn: UIButton! 

    @IBOutlet weak var eventDate: UITextField! 
    @IBOutlet weak var addEvent: UIBarButtonItem! 

    var picker = UIImagePickerController() 

    let datePicker = UIDatePicker() 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     picker.delegate = self 
     createDatePicker() 
    } 

    func createDatePicker(){ 

     //format for picker 

     datePicker.datePickerMode = .dateAndTime 

     // toolbar 

     let toolbar = UIToolbar() 

     toolbar.sizeToFit() 

     // bar button item 

     let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed)) 
     toolbar.setItems([doneButton], animated: false) 

     eventDate.inputAccessoryView = toolbar 

     //assigning date picker to text field 

     eventDate.inputView = datePicker 

    } 
    func donePressed(){ 

     //format date 

     let dateFormatter = DateFormatter() 

     dateFormatter.dateStyle = .short 
     dateFormatter.timeStyle = .short 

     eventDate.text = dateFormatter.string(from: datePicker.date) 
     self.view.endEditing(true) 

    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let image = info[UIImagePickerControllerEditedImage] as? UIImage { 
      self.eventImage.image = image 
      selectImageBtn.isHidden = true 
      addBtn.isHidden = false 
     } 

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

    @IBAction func selectImage(_ sender: Any) { 

     picker.allowsEditing = true 
     picker.sourceType = .photoLibrary 

     self.present(picker, animated: true, completion: nil) 
    } 

    @IBAction func addEventPressed(_ sender: Any) { 


    } 



    @IBAction func addPressed(_ sender: Any) { 

     AppDelegate.instance().showActivityIndicator() 

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

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

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

     let uploadTask = imageRef.put(data!, metadata: nil) { (metadata, error) in 
      if error != nil { 
       print(error!.localizedDescription) 
       AppDelegate.instance().dismissActivityIndicatos() 
       return 
      } 

      imageRef.downloadURL(completion: { (url, error) in 
       if let url = url { 
        let feed = ["userID" : uid, 
           "pathToImage" : url.absoluteString, 
           "event name" : self.eventName.text!, 
           "event date" : self.eventDate.text!, 
           "author" : FIRAuth.auth()!.currentUser!.displayName!, 
           "event information" : self.eventInf.text!, 
           "postID" : key] as [String : Any] 

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

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

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

     } 

     uploadTask.resume() 



    } 




    } 

マイコードチェックデータベースを:

private func loadPlaces() { 


     let ref = FIRDatabase.database().reference() 

     ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in 

      let images = snapshot.value as! [String : AnyObject] 
      // self.places.removeAll() 
      for (_, value) in images { 
        let userToShow = events() 
       if let img = value["pathToImage"] as? String, 
        let eventDate = value["event date"] as? String, 
        let name = value["event name"] as? String 
        //let information = value["information"] as? String 
       { 


        // self.places.append(historicalPlaces(img: img , name: name2, inf:information)) 

        userToShow.eventImages = img 
        userToShow.eventDates = eventDate 
        userToShow.eventnames = name 
        // userToShow.information = information 
        self.event.append(userToShow) 

       } 


      } 
      self.tableView.reloadData() 
     }) 
     // ref.removeAllObservers() 

    } 

と、これは私のuploadPostコードです:ここで

は私のコードを取得します私は新しいイベントを追加しますか?

答えて

0

テーブルを更新しない理由は、バックグラウンドスレッドでテーブルをリロードしようとしているためです。 代わりに、メインスレッドでリロードしてください。このように:

DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

更新されたコード

private func loadPlaces() { 


    let ref = FIRDatabase.database().reference() 

    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in 

     let images = snapshot.value as! [String : AnyObject] 
     // self.places.removeAll() 
     for (_, value) in images { 
       let userToShow = events() 
      if let img = value["pathToImage"] as? String, 
       let eventDate = value["event date"] as? String, 
       let name = value["event name"] as? String 
       //let information = value["information"] as? String 
      { 


       // self.places.append(historicalPlaces(img: img , name: name2, inf:information)) 

       userToShow.eventImages = img 
       userToShow.eventDates = eventDate 
       userToShow.eventnames = name 
       // userToShow.information = information 
       self.event.append(userToShow) 

      } 


     } 

     DispatchQueue.main.async { 
      self.tableView.reloadData() 
     } 
    }) 
    // ref.removeAllObservers() 

} 
+0

ありがとうございますが、私のコードにそのコードを追加できる場所はありません。教えてくださいますか? –

+0

'func loadPlaces()'の最後の行で、 'self.tableview.reload()'を実行しています。 – dRAGONAIR

+0

この変更で回答を更新しました。 – dRAGONAIR

0

私は回避策として、データベースからデータを取得し、更新ボタンを追加してみました。

@IBAction func refresh(_ sender: Any) { 

     loadPlaces() 


    } 

と重複イベントを防ぐためにこのコードを挿入しました。

self.event.removeAll() 
関連する問題