【发布时间】:2020-04-08 00:03:15
【问题描述】:
一旦满足if myDay == self.daysOfWeek[self.picker.selectedRow(inComponent: 0)] 这个条件,我就会尝试跳出这个监听器,但是我没有得到我想要的结果。
一旦满足条件,它就会继续循环遍历所有文档。如何正确编码?
let addAction = UIAlertAction(title: "Add Workout", style: .default) { (UIAlertAction) in
if self.dayCount != 0 {
print("\(self.dayCount)")
self.colRef.addSnapshotListener { (querySnapshot, err) in
if let err = err
{
print("Error getting documents: \(err)");
}
else
{
for document in querySnapshot!.documents {
let myData = document.data()
let myDay = myData["dow"] as? String ?? ""
print(self.daysOfWeek[self.picker.selectedRow(inComponent: 0)])
print(myDay)
if myDay == self.daysOfWeek[self.picker.selectedRow(inComponent: 0)] {
containsDay = true
print(containsDay)
dayId = document.documentID
workoutColRef = Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(dayId)/Workouts/")
break //This Break needs to be somewhere else???
}
}
}
}
if containsDay == true {
//Create new workout and store within the selectedDay.
workoutColRef.addDocument(data: ["workout" : "\(self.textField2.text!)", "dayRef" : "\(dayId)"])
self.loadDays()
} else {
//Create new day as well as a new workout, and store the workout within the day.
let newDayRef = self.colRef.addDocument(data: ["dow" : "\(self.daysOfWeek[self.picker.selectedRow(inComponent: 0)])"])
Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(newDayRef.documentID)/Workouts/").addDocument(data: ["workout" : "\(self.textField2.text!)", "dayRef" : newDayRef])
newDayRef.getDocument { (docSnapshot, err) in
if let err = err
{
print("Error getting documents: \(err)");
}
else
{
let myData = docSnapshot!.data()
let myDay = myData!["dow"] as? String ?? ""
self.daysArray.append(myDay)
}
}
self.dayIdArray.append(newDayRef.documentID)
self.loadDays()
}
} else {
self.dayCount += 1 //If there are no days/workouts, we create new day as well as a new workout, and store the workout within the day.
let newDayRef = self.colRef.addDocument(data: ["dow" : "\(self.daysOfWeek[self.picker.selectedRow(inComponent: 0)])"])
Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(newDayRef.documentID)/Workouts/").addDocument(data: ["workout" : "\(self.textField2.text!)", "dayRef" : newDayRef])
newDayRef.getDocument { (docSnapshot, err) in
if let err = err
{
print("Error getting documents: \(err)");
}
else
{
let myData = docSnapshot!.data()
let myDay = myData!["dow"] as? String ?? ""
self.daysArray.append(myDay)
}
}
self.dayIdArray.append(newDayRef.documentID)
self.loadDays()
}
}
【问题讨论】:
-
我在下面写了一个答案,但随后查找了一些 Swift 信息,据我所知,您的
break应该与for in不同。您如何确定它会继续处理? -
@FrankvanPuffelen 我更新了代码以显示整个操作。我确定它继续处理,因为它打印“真”,当我只调用一次操作时两次。
-
您可能希望在该语句上放置一个断点并在调试器中单步执行代码。据我所知(但我绝对不是 Swift 专家),
break应该中止循环。但是,如果是这种情况,单步执行会很快告诉你。如果不是,我的回答可能仍然提供一种解决方法,即使我认为它应该不需要。 -
这里有几个问题,但最重要的是这行
if containsDay == true将在self.colRef.addSnapshotListener之后立即执行,这似乎不是您想要的。 Firebase 调用是异步的,闭包之后的代码将在 in 闭包的代码之前执行。
标签: ios swift firebase google-cloud-firestore