forループ内のfirebaseからデータを取得しようとしていますが、動作しません。Firebaseを同期してSwift DispatchQueueを実行します
私はDispatchQueueを使用するはずですが、Firebaseでどのように使用するのか分かりません。
私はループだ:私は私のfirebase機能の一つの例は、
**** **** 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)
}
})
}
}
}
を呼んでいる私の関数endDeleteLastSerieインサイド
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)")
}
}
を
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")
}
}
}
しかし、私「取得mは次のとおりです。
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
私は内部のループのために私を追加しようとしました:
DispatchQueue.main.sync { }
または
DispatchQueue.global().sync(execute: { })
または
var _dispatchQueue:DispatchQueue = DispatchQueue(label: "first", qos: .userInteractive)
その後、内側のループのために私を追加
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
ここで 'DispatchQueue'を使って何を達成しようとしていますか? Firebase SDKはすでに、メインスレッドからネットワークインタラクションをすべて行います。メインスレッドで実行されるのは、あなたのコールバック/補完ハンドラを呼び出すことだけです。 –
事実ですが、firebaseからコールバックを取得した後、私のforループから値を取得します。私はfirebaseのコールバックを取得するとき、私は.. let index = self.getIndexOfExercice(exerciseiceName:exerciseice)しかし、私はいつも "Pectoral Fly"をexerciceNameとして取得します – Pierre
コールバックに2つのプリントを追加して、私は得る。そして、私は彼らがコンソールログに示すように印刷物を追加しました。 @フランク・ヴァン・プフレン – Pierre