我从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推到那里一样