下载Firestore的单个对象并将其保存到结构/类对象中

时间:2019-06-24 12:07:19

标签: swift google-cloud-firestore

我从2019年1月开始编码,这是我在这里的第一篇文章。

我正在使用Swift和Firestore。在我的应用程序中,有一个tableView,其中显示从单个文档加载的事件,其中的事件数组为[String:[String:Any]]。如果用户想要获取有关事件的更多信息,请点击该事件。在后台,TableViewController将打开一个带有segue的新“ DetailEventViewController”,并在轻击的单元格中为其提供eventID的值。

当用户在DetailViewController屏幕上时,应用程序将下载一个新的文档,其EventID作为文档的键。

我想将此数据从Firestore中保存到名为Event的Struct中。对于此示例,仅使用Event(eventName:String)。

当我获得所有数据时,可以直接将其打印出来,但不能将其保存在变量中,以后再打印出来。我真的不知道为什么如果我在要获取数据的括号内打印结构,但是如果将其保存到变量中并尝试使用此变量,它将说为零。

那么我如何才能从Firestore中获取数据并仅保存在一个ValueObject中(var currentEvent = Event?-> currentEvent = Event.event(for:data as [String:Any]))

我在google,firebaseDoc和stackoverflow中进行搜索,但未找到任何相关信息,因此我尝试将数据的所有singe信息保存在singe值内。

// Struct

struct Event {
var eventName: String!

static func event(for eventData: [String:Any]) -> Event? {
guard let _eventName = eventData["eventName"] as? String    
else {
print("error")
return nil
}
return Event(eventName: _eventName)
}

// TableView VC 这应该工作

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowEventDetailSegue" {
  if let ShowEvent = segue.destination as?                                               DetailEventViewController, let event = eventForSegue{
            ShowEvent.currentEventId = event.eventID
        }
    }
}

// DetailViewController

var currentEvent = Event()
var currentEventId: String?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard let _eventID = currentEventId else {
        print("error in EventID")
        return}

    setupEvent(eventID: _eventID) /* currentEvent should be set here                 */
    setupView(event: currentEvent) /* currentEvent has after     "setupEvent" the value of nil */
}

func setupEvent(eventID: String) {

let FirestoreRef =     Firestore.firestore().collection("events").document(eventID)

FirestoreRef.getDocument { (document, error) in
        if let err = error {
            debugPrint("Error fetching docs: \(err)")
            SVProgressHUD.showError(withStatus: "Error in Download")
        }else {
            if let document = document, document.exists {
                guard let data = document.data() else {return}

            let eventData = Event.event(for: data as [String:Any])

                print(eventData)
//here all infos are printed out - so I get them

                self.currentEvent = eventData! 

//Here is the error.. I can't save the fetched Data in my single     current Event 
} else {
                SVProgressHUD.showError(withStatus: "Error")
            }
        }
    }


}

func setupView(event: Event) {
self.titleLabel.text = event.eventName
}

我希望函数setupEvents将给DetailViewController中的currentEvent一个SINGLEvalue值,因为它的SINGLE文档不是数组。因此,我可以使用单个Eventvalue进行进一步的操作。就像为新的ViewController启动新的Segue并只是将Event推到那里一样

0 个答案:

没有答案