我试图从for循环中的firebase中获取一些数据,但它不起作用。
我知道我应该使用DispatchQueue,但我无法理解我应该如何在Firebase中使用它。
我有一个循环:
for i in 0..<Exercice.workout.count{
exercice = (Exercice.workout[i] as! [[Any]])[0][0] as! String
print("Exercice: \(exercice)")
self.endDeleteLastSerie(key: key, exercice: exercice, callback: {(status, endTime) in
if status == "success"{
print("do stuff here")
let index = self.getIndexOfExercice(exerciceName: exercice)
print("Index: \(index)")
print("ExerciceName: \(exercice)")
}
}
在我的函数endDeleteLastSerie中我调用2个firebase函数
func endDeleteLastSerie(key:String, exercice: String, callback: @escaping(_ status:String, _ endTime: Int)->Void){
FirebaseWorkout.deleteSerie(key: key, exercice: exercice) { (status) in
if status == "success" {
//we set the end time to firebase
FirebaseWorkout.updateEndExercice(exercice: exercice, callback: { (status, endTime) in
if status == "success" {
callback("success", endTime)
}else{
callback("error", endTime)
}
})
}
}
}
****我的一个firebase功能示例****
static func deleteSerie(key: String, exercice: String, callback: @escaping (_ status: String)->Void){
let uid = FirebaseUsers.User.uid
print("remove")
Database.database().reference().child("users/"+uid+"/workout/"+self.workoutKey+"/exercice/"+exercice+"/series/"+key).removeValue { (error, DatabaseReference) in
if error == nil {
print("removed from firebase")
callback("success")
}else{
callback("error")
}
}
}
但我得到的是:
Exercice: Bench Press
remove
Exercice: Pectoral Fly
remove
removed from firebase
removed from firebase
do stuff here
Index: 1
ExerciceName: Pectoral Fly
do stuff here
Index: 1
ExerciceName: Pectoral Fly
我试图在里面添加我的for循环:
DispatchQueue.main.sync { }
或
DispatchQueue.global().sync(execute: { })
或
var _dispatchQueue:DispatchQueue = DispatchQueue(label: "first", qos: .userInteractive)
然后将我的for循环添加到
中self._dispatchQueue.sync { }
但没有任何作用
我该如何解决这个问题?得到
Exercice: Bench Press
remove
removed from firebase
do stuff here
Index: 0
ExerciceName: Bench Press
Exercice: Pectoral Fly
remove
removed from firebase
do stuff here
Index: 1
ExerciceName: Pectoral Fly
答案 0 :(得分:0)
我们这里没有足够的代码来了解应用程序的部分内容。但是,它似乎与您的Firebase代码无关。如何管理Exercise.workout数组?
在您的第一个代码段中:
for i in 0..<Exercice.workout.count{
exercice = (Exercice.workout[i] as! [[Any]])[0][0] as! String
print("Exercice: \(exercice)")
self.endDeleteLastSerie(key: key, exercice: exercice, callback: {(status, endTime) in
if status == "success"{
print("do stuff here")
let index = self.getIndexOfExercice(exerciceName: exercice)
print("Index: \(index)")
print("ExerciceName: \(exercice)")
}
}
for循环正在通过Exercise.workout数组运行,你引用的函数似乎不会从数组中删除项目。当然,这可能是代码中的其他地方。另外,我们不知道getIndexOfExercice函数是如何工作的。
此外,您正在处理不同线程上的机箱,因此print语句可以按各种顺序发生。如果您希望这些同步发生,则需要添加代码来执行此操作。
有许多同步线程的方法,StackOverflow或一般谷歌搜索有很多例子。
但是我不认为这是你问题的症结所在,所以如果这对你找不到问题没有帮助,你需要在使用的数组周围提供更多的代码(以及getindex函数)。