2016-06-28 20 views
-1

imはfirebaseで作業しようとしていますが、この関数はArrayに "Offers"を保存してから、この配列を別のViewControllerに送信してtableViewに表示します。Swift Make For Loopが非同期関数の終了を待つ

データがサーバから来て、firebaseのコールバックが来る前にforループが終了しているという問題が見つかりました。ここで、 "fir(self.goodOffer ...)"という行が終わりですfirebaseコールバックの

多分誰かがforループをファイアベースのコールバックが終了するのを待たせることができますか?

thx。

geocodeAddress(totalFromLocation, callback: { (location) in 

       if location != nil { 
        fromLocation = location 
        self.geocodeAddress(totalToLocation, callback: { (location) in 
         if location != nil { 
          toLocation = location 
          mainDistance = Int(self.distanceCalculate(fromLocation!, locationTwo: toLocation!)) 
          print(mainDistance) 

          REF_BUSSINES_OFFERS.queryOrderedByKey().queryEqualToValue("north").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
           print("in snap") 
           if let value = snapshot.value { 
            if self.isAlavator { 
             if let area = value["north"] { 
              if let data = area!["withAlavator"]! { 
               if let bids = data["bids"] as? Int { 
                for i in 1..<bids+1 { 
                 if let bid = data["\(i)"] { 
                  let bidFromSize = bid!["fromSize"] as! Int 
                  let bidToSize = bid!["toSize"] as! Int 

                  let bidFromDistance = bid!["fromDistance"] as! Int 
                  let bidToDistance = bid!["toDistance"] as! Int 

                  if mainDistance >= bidFromDistance && mainDistance <= bidToDistance { 
                   if Int(totalSize) >= bidFromSize && Int(totalSize) <= bidToSize { 
                    let price = String(bid!["price"]) 
                    let name = bid!["name"] as! String 
                    let phoneNumber = bid!["phoneNumber"] as! String 
                    var logoImageData: NSData! 
                    LOGOS_REF.child("\(phoneNumber)").dataWithMaxSize(3 * 1024 * 1024, completion: { (data, error) in 
                     if error != nil { 
                      logoImageData = UIImagePNGRepresentation(UIImage(named: "company")!) 
                     } else { 
                      logoImageData = data 
                     } 
                     let offer = Offer(logoImage: logoImageData, name: name, price: price) 
                     self.goodOffers.append(offer) 
                     print("fir \(self.goodOffers[0].price)") 
                    }) 
                   } 
                  } 
                 } 
                 print(i) 
                }//end of for 
                print("out") 
                //self.changgeViewToTable() 
               } 
+5

良い悲しみは、あなたのコードが画面の横に走っています。どのように多くのレベルが深いかを知っているあなたのものを入れ子にするのではなく、早く帰ることができるように、 (また、 "alavator"は何ですか?) –

+1

エラーを修正したときに[Code Review](http://codereview.stackexchange.com/)に投稿する必要があります。あなたのコードは悪夢の素材です – Kametrixom

答えて

2

あなたのコードは読みにくいなどの理由で、あまり役に立ちません。 ObjectMapperを使用して、これらのフィールドをマップするレベル(および努力)を減らしてください。非同期タスクが完了すると、各dispatch_group_enter()dispatch_group_leave()を補うことが必要です

let group = dispatch_group_create() 
for i in 1..<bids+1 { 
    // ... 
    dispatch_group_enter(group) 
    LOGOS_REF.child("\(phoneNumber)").dataWithMaxSize(3 * 1024 * 1024) { 
     // ... 

     dispatch_group_leave(group) 
    } 
}  

// Wait for all async calls to complete before proceeding 
dispatch_group_wait(group, DISPATCH_TIME_FOREVER) 

:とにかく、あなたはさまざまな非同期呼び出しを同期するためにdispatch_groupを使用することができます。

+0

どこが本当にわからないのですか?あなたはOPの質問からこのコードを手に入れましたが、 'dispatch_group_wait'が' for'ループの後にあることを意図していたので、すべての呼び出しは非同期的に – Kametrixom

+0

@Kametrixom良い目で実行されます。 'dispatch_group_wait'を' for'ループの外側に移動しました。ありがとう! –

+0

@CodeDispatch_group_notify(group、dispatch_get_main_queue()){self.changgeViewToTable()} 'は' dispatch_group_wait(group、DISPATCH_TIME_FOREVER) 'より優れています。 –

関連する問題