2016-07-26 6 views
-1

これは初めてのスタックオーバーフローを使用しています。私は私のプログラムが移動する前にクエリタスクが完了するまで待つようにしていますが、正しく動作することはありません。私はデバッグのためにprintステートメントを入れました。 2番目と3番目の印刷は常に最初の印刷の前に行われます。私はdispatch_syncをよく理解していないと思います。どんな助けでも大歓迎です!迅速にdispatch_syncを使用するにはどうすればよいですか?

 let concurrentQueue = dispatch_queue_create(
      "com.x.TinderClone.queue", DISPATCH_QUEUE_CONCURRENT) 

     dispatch_sync(concurrentQueue) { 
      usersRef.queryOrderedByChild("gender").queryEqualToValue(userInterestedIn).observeSingleEventOfType(.Value, withBlock: {snapshot in 
       for child in snapshot.children { 
        let uid = child.key!! 
        let gender = child.value!!["gender"] as! String 
        let id = child.value!!["id"] as! String 
        let interestedInWomen = child.value!!["interestedInWomen"] as! Bool 
        let name = child.value!!["name"] as! String 

        let potentialMatch = User(uid: uid, gender: gender, id: id, interestedInWomen: interestedInWomen, name: name) 
        listOfPotentialMatches.append(potentialMatch) //add the user struct to the array 
       } 

       print("First") // First print 

       // ... 
       }) { (error) in 
        print(error.localizedDescription) 
      } 

      print("Second") // Second Print 
     } 

     print("Third") //Third print 

答えて

0

あなたが発見したように、dispatch_syncは本当にあなたを助けてくれていません。問題は、observeSingleEventOfTypeに提供したブロックが、同期して実行されない引数として渡され、Firebaseが適切と考える(おそらくイベントが発生した)ときに実行されることです。

"First""Second"とと"Third"印刷を行うための最も簡単な方法は、彼らに内のブロックを置くために、またはあなたがブロックの最後に呼び出す関数内でそれらを置くことであろう。

1

observeSingleEventOfType(:withBlock:)print("First")含め、あなたが書いたコードのほとんどを含むブロックを、取ります。 そのブロックは非同期に実行されます。

つまり、dispatch_syncコードは非同期コードを呼び出します。即時のdispatch_syncコードはすぐに実行されますが、非同期コードは呼び出されますが、呼び出されません。

observeSingleEventOfType(:withBlock:)に渡されたブロックが順不同で実行され、それに応じて設計されると仮定する必要があります。

0

私は前にこの同じ問題を見ました。最近私は、あなたのデータがFirebaseから引き抜かれるのを待つためにTimersを使って回避策を見つけました。あなたのObserveイベントの後にあなたの行動に適応しようとすることができるスニペットはここにあります:

var timer:NSTimer?

プライベートFUNCのattemptReloadOfTable(){ self.timer?.invalidate()

self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(self.handleReloadTable), userInfo: nil, repeats: false) 
} 
関連する問題