2017-08-17 12 views
0

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 
+0

ここで 'DispatchQueue'を使って何を達成しようとしていますか? Firebase SDKはすでに、メインスレッドからネットワークインタラクションをすべて行います。メインスレッドで実行されるのは、あなたのコールバック/補完ハンドラを呼び出すことだけです。 –

+0

事実ですが、firebaseからコールバックを取得した後、私のforループから値を取得します。私はfirebaseのコールバックを取得するとき、私は.. let index = self.getIndexOfExercice(exerciseiceName:exerciseice)しかし、私はいつも "Pectoral Fly"をexerciceNameとして取得します – Pierre

+0

コールバックに2つのプリントを追加して、私は得る。そして、私は彼らがコンソールログに示すように印刷物を追加しました。 @フランク・ヴァン・プフレン – Pierre

答えて

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関数の働きもわかりません。

さらに、異なるステートメントでエンクロージャを扱うため、さまざまな順序で印刷文が実行される可能性があります。これらが同期的に発生するようにするには、コードを追加する必要があります。

スレッドを同期させる方法はたくさんありますが、StackOverflowや一般的なGoogle検索ではたくさんの例があります。

私はこれがあなたの質問の要点だとは思わないので、これが問題を見つけるのに役立たない場合、使用されている配列(およびgetindex関数)の周りにもっとコードを提供する必要があります。

関連する問題